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 管理)。谢谢。
我正在使用 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 管理)。谢谢。