Java 在自定义实现中包装Hibernate PersistentSet的正确方法?
我已经实现了一个Java 在自定义实现中包装Hibernate PersistentSet的正确方法?,java,hibernate,Java,Hibernate,我已经实现了一个observateSet类,它包装了一个集合,并实现了集合接口和可观察模式,在添加或删除元素时向注册的侦听器触发事件。我想在Hibernate映射的类中使用这个ObservateSet。Hibernate希望为Set设置Getter和Setter,并将它们设置为PersistentSet的实例。与中一样,我最初尝试向Getter和Setter添加逻辑,以便用observeSet包装传入的任何集合,但这会导致异常:线程“main”中的异常org.hibernate.Hibernat
observateSet
类,它包装了一个集合,并实现了集合接口和可观察模式,在添加或删除元素时向注册的侦听器触发事件。我想在Hibernate映射的类中使用这个ObservateSet。Hibernate希望为Set
设置Getter和Setter,并将它们设置为PersistentSet的实例。
与中一样,我最初尝试向Getter和Setter添加逻辑,以便用observeSet包装传入的任何集合,但这会导致异常:线程“main”中的异常org.hibernate.HibernateException:cascade=“all delete orphan”的集合不再被所属实体实例引用:…
我不需要从Hibernate中监听更改。我主要关心的是,一旦我从数据库中反序列化对象,我就可以监听更改。我可以编写第二个(非bean)getter,它只返回包装器observeset,然后通过编码约定,除了通过这个方法得到的包装器之外,我们不改变内部集合的内容,但这似乎有点令人不快和令人讨厌
想法?您可以使用注释对一对多集合进行注释,如下所示:
@OneToMany(...)
@CollectionType(type = "some.collection.Type")
public Set<Entity> getEntities() {
return entities;
}
@OneToMany(…)
@CollectionType(type=“some.collection.type”)
公共集合getEntities(){
返回实体;
}
并实现一些.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;
}
}
公共类TestCollectionType实现UserCollectionType{
@凌驾
公共PersistentCollection实例化(SessionImplementor会话,CollectionPersister persister)
抛出冬眠异常{
返回新的包装器(新的PersistentSet(session));
}
@凌驾
公共对象实例化(int expectedsize){
返回新包装(newhashset());
}
@凌驾
公共PersistentCollection包装(SessionImplementor会话,对象集合){
返回新的包装器(新的PersistentSet(会话,(集合)集合));
}
@凌驾
公共迭代器getElementsIterator(对象集合){
return((Set)collection.iterator();
}
@凌驾
公共布尔包含(对象集合、对象实体){
返回((集合)集合)。包含(实体);
}
@凌驾
公共对象索引of(对象集合、对象实体){
抛出新的UnsupportedOperationException();
}
@凌驾
公共对象替换元素(对象原始、对象目标、CollectionPersister persister、对象所有者、,
映射copyCache、SessionImplementor会话)引发HibernateException{
((设置)目标)。清除();
((设置)目标)。添加所有((设置)原始文件);
回报目标;
}
}
列表或映射的实现方式相同。为什么需要向侦听器触发事件?