我确定这与 this question 密切相关但是关于这个问题的操作有一些场景,我不确定它是否对 DI 有意义。所以这就是我的理解,尝试将 JPA 实体与 CDI Bean 混合通常不是一个好主意,因为两者通常都是通过创建代理对象来完成的。这是我的设想,但从我读到的内容来看,这是不可能的。
@Entity
public class MyUniqueObject implements Serializable {
@Inject
private transient Logger log;
@Inject
private transient Event<MyUniqueObjectEvent> events;
@Id
private long id;
@NotNull
private String text;
public void setText( final String text ) {
log.debug( "updating text {}", this );
this.text = text;
events.fire( new MyUniqueObjectEvent( this ) ); // consumed by an @Observes method
}
}
完成我想要完成的事情的最佳方法是什么?这基本上是诸如从 JPA 持久化实体中触发的事件、对日志对象的访问。代码示例很有帮助。
最佳答案
我想知道观察实体属性的每个更改是否真的有用,即使它们最终不会持久化。所以你不认为Entity Listeners and Callbacks对你来说还不够吗?他们从 JPA 2.1 开始支持 CDI,并提供大量你可以观察到的回调
- @PrePersist
- @PreRemove
- @PostPersist
- @PostRemove
- @预更新
- @PostUpdate
- @PostLoad
所以你会得到
@EntityListeners(class=Audit.class)
@Entity
public class MyUniqueObject implements Serializable {}
public class Audit {
@Inject
private Logger log;
@Inject
private Event<MyUniqueObjectEvent> events;
}
现在您可以观察实体的生命周期 - 最好将模型与其审计分开,您不必为了实现日志记录而搞乱 setter 和 getter(这很困惑)。另请注意,您还可以定义 Default Entity Listeners对于您拥有的每个实体。
关于java - CDI 将服务注入(inject) JPA 托管实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21743823/