Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/389.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在自定义实现中包装Hibernate PersistentSet的正确方法?_Java_Hibernate - Fatal编程技术网

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{
((设置)目标)。清除();
((设置)目标)。添加所有((设置)原始文件);
回报目标;
}
}

列表或映射的实现方式相同。

为什么需要向侦听器触发事件?