我在Hibernate上使用带有JPA的Spring Boot 2。
我必须使某些实体具有特殊的审核功能。我可以简单地使用实体类中的@PrePersist
/ @PostPersist
回调来实现它。
我想将此回调放在基类中。但是,如果此基类是不带@Entity
注释的简单Java类,则不会调用回调。
如果我也将@Entity
注释放在基类上,那么我将得到一个错误Table 'my_base_class_entity' doesn't exist
。
这有效:
@Entity
@Table(name = "document")
public class JpaDocument {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Long id;
...
@PrePersist
public void prePersist(){
logger.debug("PrePersist started");
}
}
这不是(未调用回调函数)
public abstract class SpecialEntity {
@PrePersist
public void prePersist(){
logger.debug("PrePersist started");
}
}
@Entity
@Table(name = "document")
public class JpaDocument extends SpecialEntity {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Long id;
...
}
可能我应该将@Entity
注释添加到我的SpecialEntity
类中,但是这迫使我添加主键,这是我不想要的,因为在子实体之间它并不总是相同的。除此SpecialEntity
没有数据库关系之外,它不是真实的实体。
答案 0 :(得分:0)
解决方案非常简单。感谢@JB_Nizet评论。
代替@Entity
批注,@MappedSuperclass
批注已添加到基类,因此可以正常工作。
@MappedSuperclass
public class SpecialEntity {
@PrePersist
public void prePersist(){
logger.debug("PrePersist started");
}
}
@Entity
@Table(name = "document")
public class JpaDocument extends SpecialEntity {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Long id;
...
}