强制Hibernate使用我的自定义列表实现

时间:2012-12-09 17:27:45

标签: java hibernate

我有一个业务对象,它公开了一个想要拥有控制权的元素列表。

为此,我创建了一个带有侦听器的自定义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使用我的自定义列表实现?或者在加载内容后填写它?

提前感谢您的帮助。

1 个答案:

答案 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()解决方案(在实体更新,保留或加载之后)。