java – CDI将服务注入JPA管理的实体
作者:互联网
我确信这与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对你来说不够吗?他们支持CDI自JPA 2.1起并提供大量回调你可以观察到
> @PrePersist
> @PreRemove
> @PostPersist
> @PostRemove
> @PreUpdate
> @PostUpdate
> @PostLoad
所以你会得到
@EntityListeners(class=Audit.class)
@Entity
public class MyUniqueObject implements Serializable {}
public class Audit {
@Inject
private Logger log;
@Inject
private Event<MyUniqueObjectEvent> events;
}
现在,您可以观察实体的生命周期 – 您最好将模型与审计分开,您不必陷入设置器和getter(这令人困惑)以实现日志记录.另请注意,您还可以为您拥有的每个实体定义Default Entity Listeners.
标签:java,jpa,hibernate,cdi,weld 来源: https://codeday.me/bug/20190629/1323098.html