3

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

为此,我创建了一个带有侦听器的自定义 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,然后将一些元素添加到它自己的列表中。因此,我最终得到了一个空列表。

有没有办法让休眠使用我的自定义列表实现?还是在加载内容后填充它?

在此先感谢您的帮助。

4

1 回答 1

2

我的第一个想法是做这样的事情:

您始终可以使用 setter 来更改列表实现(类似于您所做的)。例如:

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

然而,要使其工作,您需要更改 CustomList 的实现以作为装饰器工作,因此它将独立于包装列表类型工作。

正如@millimoose 所注意到的,它仍然不能解决您的问题。

可以通过使用 Hibernate(或 JPA)生命周期注释(例如 @PostPersist、@PostUpdate 或 @PostLoad...)找到可行的解决方案。因此,您可以使用该 customList.addAll() 解决方案(在更新、持久化或加载实体之后)。

于 2012-12-09T17:43:43.343 回答