Spring Boot 中未调用 JPA 实体上的 @PostConstruct

@PostConstruct on JPA entity not called in Spring Boot

我正在使用 Spring Boot,并且我将 @PostConstrcut 注释添加到我的 JPA 实体中,如图所示,但是当实体被实例化时,这个拦截器永远不会被调用。

@Entity
public class MyTableName implements java.io.Serializable {
   // all attributes
   @PostConstruct
   public void init(){
     // This code never called
     System.out.println("PostConstruct");
   }
}

为什么要在实体 bean 中使用 @PostConstruct?我认为这里有设计的味道。也许您指的是带有@PrePersist、@PreUpdate 或@PostPersist @PostUpdate 注释的方法,运行 在保存实体之前或之后编码?

JPA 实体不是 spring 托管 bean,因此 Spring 永远不会调用 @PostConstruct。实体有自己的实体侦听器注释,但没有任何语义 @PostConstruct@PrePersist@PostLoad 可能是最接近的)。实体需要有一个默认构造函数,因为所有 JPA 实现都使用 Class.newInstance() 作为默认实例化策略。一个好的JPA provider会允许你自定义实例化策略,所以你可以自己编写@PostConstruct的拦截并调用它,也可以将@Autowire spring beans转化为实体如果你想。但是,您永远不应将 JPA 实体注册为 Spring bean。

我找到了解决方案,事实上,我没有使用@PostConstruct 注解(由容器管理),而是使用了@PostLoad(由ORM 管理)。谢谢。