gpt4 book ai didi

java - 在自定义实现中包装 Hibernate PersistentSet 的正确方法?

转载 作者:行者123 更新时间:2023-11-30 09:32:02 25 4
gpt4 key购买 nike

我已经实现了一个 ObservableSet 类,它包装了一个 Set 并实现了 Set 接口(interface)和 Observable 模式,在添加或删除元素时向注册的监听器触发事件​​。我想在 Hibernate 映射的类中使用这个 ObservableSet。 Hibernate 需要 Set 的 getter 和 setter,并将它们设置为 PersistentSet 的实例。this question from 2010 ,我最初尝试向 Getter 和 Setter 添加逻辑以包装通过 ObservableSet 传入的任何 Set,但这会导致异常:Exception in thread "main"org.hibernate.HibernateException: A collection with cascade="all-delete-orphan"不再被拥有的实体实例引用:...

我不需要从 Hibernate 中监听变化。我主要担心的是,一旦我从数据库中反序列化对象,我就可以监听更改。我可以编写第二个(非 beans)getter,它只返回包装器 ObservableSet,然后通过编码约定强制我们不改变内部集的内容,除非通过我们通过此方法获得的包装器,但这似乎很好令人不快和骇人听闻。

想法?

最佳答案

您可以使用注释来注释一对多集合,如下所示:

@OneToMany(...)
@CollectionType(type = "some.collection.Type")
public Set<Entity> getEntities() {
return entities;
}

并实现 some.collection.Type 以包装 PersistentSet:

public class TestCollectionType implements UserCollectionType {
@Override
public PersistentCollection instantiate(SessionImplementor session, CollectionPersister persister)
throws HibernateException {
return new Wrapper(new PersistentSet(session));
}
@Override
public Object instantiate(int anticipatedSize) {
return new Wrapper(new HashSet<>());
}

@Override
public PersistentCollection wrap(SessionImplementor session, Object collection) {
return new Wrapper(new PersistentSet(session, (Set<?>)collection));
}

@Override
public Iterator getElementsIterator(Object collection) {
return ((Set<?>)collection).iterator();
}

@Override
public boolean contains(Object collection, Object entity) {
return ((Set<?>)collection).contains(entity);
}

@Override
public Object indexOf(Object collection, Object entity) {
throw new UnsupportedOperationException();
}

@Override
public Object replaceElements(Object original, Object target, CollectionPersister persister, Object owner,
Map copyCache, SessionImplementor session) throws HibernateException {
((Set<?>)target).clear();
((Set<?>)target).addAll((Set)original);
return target;
}
}

List 或 Map 的实现方式相同。

关于java - 在自定义实现中包装 Hibernate PersistentSet 的正确方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12648694/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com