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

标签 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 持久化实体中触发的事件、对日志对象的访问。代码示例很有帮助。

最佳答案

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

相关文章:

java - JPA XML 映射文件可以很好地解析,但在作为 JUnit 测试运行时无法解析

java - Hibernate Native 与 Hibernate JPA

java - 没有主键表的 Hibernate 映射

java - Hibernate:hbm2ddl 属性值,创建删除总是删除架构,即使没有显式 SessionFactory 关闭?

spring - 在 JUnit 测试用例上获取 LazyInitializationException

java - jsoup在android中获取并显示表格内容

jpa - Micronaut CRUD 操作与实体管理器不适用于具有外键的表

java - 更新 Web 应用程序的静态资源

java - 使用 Spring Security 进行基于 JWT 角色的授权

java - 如何在同一测试中使用 Appium 从 Android 内存中硬关闭/强制关闭/终止应用程序