编程语言
首页 > 编程语言> > java – CDI将服务注入JPA管理的实体

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