知识卡片

实体身份标识与数据表主键本质不同

普通读书笔记卡 · 1977.u

内容

主键作为身份标识只要确保表内唯一,原则上可定义为BigInt、VARCHAR等各种类型,列声明PRIMARY KEY后领域模型即可用@Id注解(可与@Column组合),主流库支持主键自动生成(@GeneratedValue及strategy属性,另有@SequenceGenerator/@TableGenerator)。但建模应从领域逻辑出发:实体的ID代表对象的身份标识,与数据表主键有相似(都要求唯一),本质却完全不同——前者代表业务含义、用于实体生命周期的管理与跟踪,后者代表技术含义、用于标记每行在表中的唯一性。DDD往往建议定义值对象作为实体身份标识:一方面清晰表达业务含义,另一方面值对象的封装利于应对未来主键类型的变化。发散:把ID设计成值对象,是让”业务身份”独立于”存储主键”演进的一道缓冲层。

参考来源

- 位置:《解构领域驱动设计》第19章 19.2.2(源文件:_epub-src/OEBPS/032.xhtml) - 结论依据:原文区分身份标识(业务含义)与主键(技术含义),建议用值对象作身份标识。 - 原始内容:前者代表业务含义,后者代表技术含义……领域驱动设计往往建议定义值对象作为实体的身份标识。