2011-11-03 41 views
3

我試圖跟蹤JPA OneToMany關聯中的更改,以便通知訂閱者事件對象的區域(這些關聯之一)已被更改。我首先嚐試了一下List的專業化,以瞭解變化。如何實現可移植的JPA isDirty()方法?

@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true) 
@JoinColumn(name = "col_name") 
private List<SomeType> oneOfManyLists = new CAArrayList<SomeType>(); 

我的裝飾看起來是這樣的:

public class CAArrayList<T> extends ArrayList<T> { 

    private boolean  changed = false; 

    public CAArrayList() { 
     super(); 
    } 

    public boolean isChanged() { 
     return changed; 
    } 

    // Mutable delegates 
    @Override 
    public boolean add(T e) { 
     changed = true; 
     return super.add(e); 
    } 
    .... 
} 

在我要檢查它的一對多協會已經改變了DAO, 不幸的是以下行導致了拋出ClassCastException因爲Hibernate圍繞我CAArrayList這與PersistentBag:

((CAArrayList) obj.getSomeList()).isDirty() 

下一個工作,但不是JPA的不同實現之間移植。

((PersistentBag) obj.getSomeList()).isDirty() 

這應該如何以便攜的方式完成?

+1

@Matt這可能不是那麼重要,但我們的團隊對這些事情相當嚴格,我們一直在尋找乾淨的解決方案。這可能是我忽略了JPA API中的某些內容。 – stacker

回答

2

我認爲你試圖在錯誤的級別(太低)做到這一點。

與其試圖跟蹤SomeType列表的所有內部更改,將功能更改封裝在特定服務中的此列表中,當必須修改此列表時,所有其他服務(以及表示層)將委派給該特定服務。在此集中式服務中,當服務更改SomeType列表時通知訂戶。