使用 JPA 实现 DDD 持久化 -O/R 映射元数据 - 特殊属性映射:ID、Version 和 Transient
特殊属性映射:ID、Version和Transient
实体类有一些特殊的属性,典型的有两个:实体标识符属性和乐观锁属性。由于这两个属性是所有的实体通用的,我将它们定义在一个抽象基类BaseEntity
中,由所有的实体类直接或间接继承。BaseEntity
被类级逻辑注解@MappedSuperclass
标识,其意义在下文继承映射中讲述。
一、ID属性
前文说过,实体必须拥有唯一的标识符,用于区别同类的其他实体。实体标识符属性用@Id
逻辑注解标识。这个注解可以继承。
一个类要成为实体类,至少要同时符合下面的条件:
在类级拥有
@Entity
注解。在自有或继承的可以作为标识符的属性上拥有
@Id
注解。
下面是@Id
注解标识的标识符属性:
实体的ID
属性是关联实体对象实例和数据行的关键。通常实体利用这个属性值作为对象标识符而数据库表利用它作为数据行的主键值。
实体ID
既可以由应用代码设置(例如UUID
就是很好的候选),也可以由数据库生成。上面的例子中,整型的标识符字段id
除了被注解为@Id
之外还被注解为GeneratedValue
。后者告知JPA
实现框架由数据库负责生成实体ID
值。当需要由数据库生成ID
时,ID
属性的类型通常受限为整数或长整数。
值对象没有ID
,所以不需要拥有用@Id
注解的属性。
二、版本属性
JPA
通过在实体类上定义一个类型为整数/长整数并注解为@Version
的属性来添加对表数据的乐观锁定的支持。
这个属性会随着对实体的每一次修改而递增它的值。当JPA
获取一个对象时,会记录下它当时的版本值。当修改后再次保存该实体时,JPA
会再次访问数据库,检查这个版本值是否仍然是当初的值。如果是,说明这个实体在这段时间内没有被别人修改过,可以顺利保存。如果不是,说明这个在这段时间内实体已经被别人修改过,保存会失败,并抛出乐观锁异常。通过这样的方式,可以防止数据被并发修改。
版本属性不是必须的,但强烈建议在所有的实体类上添加这个属性。
由于我决定让所有的实体都拥有版本属性,所以我把这个属性定义在所有实体的基类BaseEntity
中:
三、瞬态属性
在实体和值对象中,默认状态下所有的实例属性都是要持久化到数据库中的,与数据库中的列有对应关系。但是以下的属性不会持久化到数据库中:
静态属性
添加有
transient
修饰符的实例属性添加有
@Transient
注解的实例属性
因此,如果你想在对象持久化范围中排除某些属性,可以给该属性添加transient
修饰符或@Transient
注解。
详细内容请戳这里↓↓↓
原创 | 使用JPA实现DDD持久化-O/R映射元数据-特殊属性映射:ID、Version和Transient
这一节就讲到这里,下一节我们讲"值属性映射"。
如果觉得有收获,点个【赞】鼓励一下呗!
版权声明: 本文为 InfoQ 作者【编程道与术】的原创文章。
原文链接:【http://xie.infoq.cn/article/024cf284af7008ac3f54d8848】。文章转载请联系作者。
评论