簡體   English   中英

CDI將服務注入JPA管理的實體

[英]CDI Injecting services into JPA managed Entities

我確信這與這個問題密切相關,但是關於這個問題的操作有一個我不確定甚至對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持久化實體中觸發的事件,訪問日志對象。 代碼示例很有用。

我想知道觀察實體屬性的每個更改是否真的有用,即使它們最終不會被持久化。 所以難道你不認為實體監聽器和回調對你來說不夠嗎?他們支持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(這令人困惑)以實現日志記錄。 另請注意,您還可以為您擁有的每個實體定義默認實體偵聽器

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM