2012-12-09 32 views
3

我有一個業務對象,公開了一個想要控制的元素列表。強制Hibernate使用我的自定義列表實現

爲此,我已創建自定義列表實現(CustomList)與聽者每當一個元素添加/移除,以被通知。

public class MyClass { 
    private List<ItemClass> list; 

    public MyClass() { 
     this.list = new CustomList<ItemClass>(); 
    } 

    public List<ItemClass> getList() {...} 
    public setList(List<ItemClass>) {...} 
} 

的問題是,如果我想堅持這個對象,Hibernate使用的setter設置列表中有自己的List實現,從而短路我漂亮CostumList bahavior。

我曾嘗試與二傳手作弊,這種方式:

public setList(List<ItemClass> newList) { 
    this.list.clean(): 
    this.list.addAll(newList); 
} 

但是,這並不工作之一: 休眠首先調用setter方法,然後添加一些元素自身的列表。因此,我最終會在我身邊列出一個空白列表。

有沒有一種方法可以讓hibernate使用我的自定義列表實現?或者在加載內容後填寫它?

在此先感謝您的幫助。

回答

2

我首先想到的是做這樣的事情:

你總是可以使用的setter更改列表執行 (類似於你做了什麼)。例如:

public setList(List<ItemClass> newList) { 
    // Sets the list as a custom list. 
    list = new CustomList<>(newList); 
} 

然而,對於工作,你需要改變你的 CustomList的實施作爲decorator工作,所以它會獨立運作的包裹列表類型的。

@millimoose已經注意到,它仍然不能解決您的問題。

可以通過使用Hibernate(或JPA)lifecycle annotations(如@PostPersist,@PostUpdate或@PostLoad ...)找到一個工作解決方案。因此,您可以使用該customList.addAll()解決方案(在實體更新,保存或加載後)。

+2

裝飾者不能跟蹤底層列表的更新,OP提到他們試圖完成的更新。 – millimoose

+0

但是,hibernate仍然會繼續添加元素到自己的列表(newList)中,而不會通知我。 當他完成填充內容時,我可以收到通知,這樣我可以親自啓動這些第一個元素嗎? –

+0

@millimoose聽起來你是對的。我會用另一個建議來編輯它。不過,我仍然建議它作爲裝飾者工作。 – rvcoutinho

相關問題