CDI将服务注入JPA管理的实体

时间:2014-02-13 02:08:16

标签: java hibernate jpa cdi weld

我确信这与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持久化实体中触发的事件,访问日志对象。代码示例很有帮助。

1 个答案:

答案 0 :(得分:3)

我想知道观察实体属性的每个更改是否真的有用,即使它们最终不会被持久化。那么你不认为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;

}

现在您可以观察实体的生命周期 - 您最好将模型与审计分开,您不必搞砸setter和getter(这令人困惑)来实现日志记录。另请注意,您还可以为您拥有的每个实体定义Default Entity Listeners