gpt4 book ai didi

java - CDI 将服务注入(inject) JPA 托管实体

转载 作者:搜寻专家 更新时间:2023-11-01 03:06:08 25 4
gpt4 key购买 nike

我确定这与 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对你来说还不够吗?他们从 JPA 2.1 开始支持 CDI,并提供大量你可以观察到的回调

  • @PrePersist
  • @PreRemove
  • @PostPersist
  • @PostRemove
  • @预更新
  • @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对于您拥有的每个实体。

关于java - CDI 将服务注入(inject) JPA 托管实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21743823/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com