原创 | 使用 JPA 实现 DDD 持久化 -O/R 映射元数据:类级映射 - 实体和值对象
类级映射:实体和值对象
可以被持久化的类包括实体和值对象两大类。
一、实体映射
通过给一个类添加@Entity
逻辑注解,告知JPA
这是一个可以持久化的实体类。
请注意@Entity
逻辑注解不可以继承。这意味着如果如果父类和子类都是实体类,那么就需要分别在父类和子类上都添加@Entity
,子类不能通过从父类继承这个注解而自动成为实体类。
实体类上还可以添加可选的@Table
物理映射,表明需要将实体映射到的数据库表。这个注解有一个name
属性,用于指定表名。
如果不添加@Table
映射,JPA
默认将实体类映射到同名的数据库表中。出于下面的两个原因,我倾向于为每个实体类添加@Table
注解:
由多个单词组成的实体类(例如实体类名
OrderLine
就是由两个单词Order
和Line
组成)可以通过驼峰式命名风格在视觉上明显区分多个组成词汇。但某些数据库如Oracle
会采用全大写形式(例如ORDERLINE
)命名表,这样多个单词就无法在视觉上分辨出来。我喜欢给数据库表明确命名,用下划线分隔单词(例如ORDER_LINES
)数据表是记录的集合,用复数的形式命名表更加具有现实意义。当
JPA
实现框架在后台生成和显示SQL
语句时,“SELECT * FROM ORDERLINE
”明显不如“SELECT * FROM ORDER_LINES
”更加具有表达性。
如果在persistence.xml
中将Hibernate
属性hibernate.hbm2ddl.auto
配置为非none
的值,Hibernate
第一次启动时将会根据实体类上提供的映射元数据自动生成数据库表结构。
下面是实体类Order
的类级映射:
二、值对象映射
通过给一个类添加@Embeddable
逻辑注解,告知JPA
这是一个可持久化的值对象。下面是值对象Address
的类级映射:
也可以不在值对象类级添加@Embeddable
逻辑注解,而是在值对象作为另一个实体的单值属性(例如值对象Address
作为实体Order
的shippingAddress
属性类型)时,在实体属性上添加@Embedded
逻辑注解,告知JPA
实体的这个属性的类型是一个值对象。例如:
请务必牢记Embeddable
是类级注解,用于标记值对象类;而@Embedded
是属性级注解,用于标注实体类的某个属性,其类型是单值的值对象。二者不需要同时存在。我倾向于在属性上上注解Embedded
。
详细内容请戳这里↓↓↓
原创 | 使用JPA实现DDD持久化-O/R映射元数据:类级映射-实体和值对象
这一节就讲到这里,下一节我们讲"O/R映射元数据-特殊属性映射:ID、Version和Transient"。
如果觉得有收获,点个【赞】鼓励一下呗!
版权声明: 本文为 InfoQ 作者【编程道与术】的原创文章。
原文链接:【http://xie.infoq.cn/article/2c84bcc05d7ff2b0b8e445f9c】。文章转载请联系作者。
评论 (2 条评论)