我确信这与这个问题 https://stackoverflow.com/q/8512628/206466但是关于这个问题的OP有一些我不确定对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
}
}
什么是best做我想要完成的事情的方法?从根本上讲,这就是从 JPA 持久实体内部触发的事件、对日志对象的访问。代码示例很有帮助。
我想知道观察实体属性的每个更改是否真的有用,即使它们最终不会被持久化。所以你不认为实体监听器和回调 https://docs.jboss.org/hibernate/entitymanager/3.6/reference/en/html/listeners.html这对您来说还不够吗?他们从 JPA 2.1 开始就支持 CDI,并提供大量您可以观察到的回调
- @PrePersist
- @预删除
- @PostPersist
- @PostRemove
- @预更新
- @更新后
- @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(这很令人困惑)来实现日志记录。另请注意,您还可以定义默认实体监听器 http://www.objectdb.com/java/jpa/persistence/event#Default_Entity_Listeners_对于您拥有的每个实体。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)