我有一个业务对象,它公开了一个想要拥有控制权的元素列表。
为此,我创建了一个带有侦听器的自定义List实现( 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行为短路。
我试图用这种方式欺骗制定者:
public setList(List<ItemClass> newList) {
this.list.clean():
this.list.addAll(newList);
}
但这也不起作用: Hibernate 首先调用setter,然后将一些元素添加到自己的列表中。因此,我最终得到了一个空列表。
有没有办法可以让hibernate使用我的自定义列表实现?或者在加载内容后填写它?
提前感谢您的帮助。
答案 0 :(得分: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()解决方案(在实体更新,保留或加载之后)。