@Inheritance
继承映射在 Annotation 中使用 @Inheritance 注解,并且需要使用 strategy 属性指定继承策略,继承策略有 SINGLE_TABLE、TABLE_PER_CLASS 和 JOINED 三种
- SINGLE_TABLE
SINGLE_TABLE 是将父类和其所有的子类集合在一块,存在一张表中,并创建一个新的字段来判断对象的类型。
@Inheritance 的 strategy 属性是指定继承关系的生成策略,@DiscriminatorColumn 注解作用是指定生成的新的判断对象类型的字段的名称和类型,@DiscriminatorValue 注解是确定此类(Person)的标示,即 DiscriminatorColumn 的值。 - TABLE_PER_CLASS是为每一个类创建一个表,这些表是相互独立的。
- JOINED
JOINED 是将父类、子类分别存放在不同的表中,并且建立相应的外键,以确定相互之间的关系。
@MappedSuperclass
通过这个注解,我们可以将该实体类当成基类实体,它不会隐射到数据库表,但继承它的子类实体在隐射时会自动扫描该基类实体的隐射属性,添加到子类实体的对应数据库表中。
使用环境:
- @MappedSuperclass注解使用在父类上面,是用来标识父类的
- @MappedSuperclass标识的类表示其不能映射到数据库表,因为其不是一个完整的实体类,但是它所拥有的属性能够映射在其子类对用的数据库表中
- @MappedSuperclass标识的类不能再有@Entity或@Table注解
@PrePersist
在持久化之前自动填充实体属性。 可以用来在使用jpa的时记录一些业务无关的字段,比如最后更新时间等等。 生命周期方法注解
@PrePersist
protected void prePersist() {
if (this.createdTime == null) {
createdTime = new Date();
}
if (this.lastModifiedTime == null) {
lastModifiedTime = new Date();
}
}
@PreUpdate
用于为相应的生命周期事件指定回调方法。 该注释可以应用于实体类,映射超类或回调监听器类的方法。 用于setter 如果要每次更新实体时更新实体的属性,可以使用@PreUpdate注释。 使用该注释,您不必在每次更新用户实体时显式更新相应的属性。
@PreUpdate
protected void preUpdate() {
this.lastModifiedTime = new Date();
}
@PreRemove
事件在实体从数据库删除之前触发,即调用了 EntityManager.remove()方法或者级联删除
@PreRemove
protected void preRemove() {
this.lastModifiedTime = new Date();
}
@SQLDelete
同理,还有@SQLInsert,@SQLUpdate
调用delete方法的时候,hibernate将自动执行该语句将实现删除,通常用于逻辑删除。
@Entity
@Table(name = "User")
@SQLDelete(sql = "Update User set isDeleted = 1 where id = ?")
@Where(clause = "isDeleted = 0")
public class User {
...
}
@Where
频繁的用到的where条件,可以减少繁琐的工作量