2012-07-18 72 views
1

我在我的企業級Java應用程序中的實體類,它具有連接到它的實體監聽器:排除領域JPA實體監聽

@Entity 
@EntityListeners(ChangeListener.class) 
public class MyEntity { 

    @Id 
    private long id; 

    private String name; 

    private Integer result; 

    private Boolean dirty; 

    ... 
} 

不過,我想它使實體監聽器得到觸發所有除了布爾值之外的字段。有沒有什麼辦法排除一個字段觸發實體監聽器而不使其瞬變?

我正在使用Java EE 5與Hibernate。

回答

2

這裏有一些混合的概念。 EntityListeners不會收到有關屬性值更改的通知 - 不是針對單個屬性,也不是針對所有屬性。

因爲他們被稱爲生命週期回調。

  • 堅持(前/後)
  • 負載(POST)
  • 更新(前/後)
  • 刪除(前/後)
:它們由以下實體的生命週期事件觸發

對於他們每個人都有匹配的註釋。所以答案是,不可能通過持久屬性的類型限制這個功能。

+0

這就是我所懷疑的,謝謝你的回答! – Petter 2012-07-18 07:41:51

+0

不客氣。 – 2012-07-18 07:42:27

3

但是,如果您實施自己的解決方案是可能的。我對審計日誌業務需求也有同樣的需求,所以設計了我自己的AuditField批註,並將其應用於審計日誌記錄。

下面是一個實體bean - 站點中的示例。

@AuditField(exclude={EntityActionType.DELETE}) 
@Column(name = "site_code", nullable = false) 
private String siteCode; 

因此,該示例指示'siteCode'是審計日誌的字段,但DELETE操作除外。 (EntityActionType是一個枚舉,它包含CRUD操作。)

此外,EntityListener擁有這部分代碼。

@PostPersist 
public void created(Site pEntity) { 
log(pEntity, EntityActionType.CREATE); 
} 

@PreUpdate 
public void updated(Site pEntity) { 
log(pEntity, EntityActionType.UPDATE); 
} 

@PreRemove 
public void deleted(Site pEntity) { 
log(pEntity, EntityActionType.DELETE); 
} 

現在是什麼它在日誌中做的()是,以數字的哪些領域對審計日誌,什麼自定義操作可選擇參與。

但是,還有一個需要考慮的問題。 如果將註釋放在另一個實體變量上,那麼必須記錄實體的哪些字段? (即鏈式日誌記錄)

無論是在實體中還是以其他方式使用@AuditField註釋什麼都是您的選擇。對於我的情況,我們決定只記錄實體ID,它是數據庫表的一個PK。但是,假設業務可以改變,我想讓它變得靈活。因此,所有實體都必須實現auditValue()方法,該方法來自基礎實體類,並且默認實現(可覆蓋)將返回其ID。