2017-02-12 43 views
1

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

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

回答

0

我发现解决方案,实际上,而不是使用@PostConstruct注释(由容器管理),我用@PostLoad(由ORM管理)。谢谢。

1

你只需要确保实体也被注册为Spring管理的bean中,你可以做通过在类MyTableName@Component注解。

0

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

+0

我没有显示此类中的所有代码,但是此实体具有其他具有@Transient注释(我不会持久化的属性)的属性,并且我希望在此实体实例化后为这些属性添加值。 –

3

JPA实体不是弹簧管理的bean,所以Spring永远不会调用@PostConstruct。实体拥有自己的实体监听器注释,但是@PostConstruct@PrePersiste@PostLoad可能是最接近的)的语义没有任何意义。实体需要具有默认构造函数,因为所有JPA实现都使用Class.newInstance()作为默认实例化策略。一个好的JPA提供者将允许你自定义实例化策略,所以有可能你自己编写拦截@PostConstruct并调用它,如果你愿意的话也可以将@Autowire spring bean变成实体。但是,您永远不应该将JPA实体注册为Spring bean。

相关问题