我确信这与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持久化实体中触发的事件,访问日志对象。代码示例很有帮助。
答案 0 :(得分:3)
我想知道观察实体属性的每个更改是否真的有用,即使它们最终不会被持久化。那么你不认为Entity Listeners and Callbacks对你来说不够吗?他们支持CDI自JPA 2.1以来提供了大量的回调你可以观察到
所以你会得到
@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。