当前位置:  开发笔记 > 编程语言 > 正文

Hibernate:集合的集合

如何解决《Hibernate:集合的集合》经验,为你挑选了1个好方法。

这是我一直遇到的问题:

我想让hibernate管理一个代表集合集合的表.例如:

地图地图

套装清单

列表地图

例如,我希望能够代表这一点:

class OwningClass {  
    Long entityId;  
    Map> mapOfLists;
}

class Element {
    String data_1;
    boolean data_2;
}

作为单个表:

OWNER (Foreign key to the owner of this element) 
MAP_KEY (varchar(30) )
LIST_INDEX (int)
ELEMENT_DATA_1 (varchar(1020)
ELEMENT_DATA_2 (bit)

没有自定义的hibernate代码似乎不可能,我不介意.但我希望有人对自定义代码的外观有一些指导.

我应该扩展AbstractPersistentCollection吗?

CompositeUserType?

如果多个表都可以,那么可以管理它,但很明显,从db的角度来看,它是蹩脚的.



1> Pat..:

在https://xebia.com/blog/mapping-multimaps-with-hibernate/上找到答案

这是11年前的一篇长篇博客文章.关键代码是:

public class MultiMapType implements UserCollectionType {

public boolean contains(Object collection, Object entity) {
    return ((MultiMap) collection).containsValue(entity);
}

public Iterator getElementsIterator(Object collection) {
    return ((MultiMap) collection).values().iterator();
}

public Object indexOf(Object collection, Object entity) {
    for (Iterator i = ((MultiMap) collection).entrySet().iterator(); i.hasNext();) {
        Map.Entry entry = (Map.Entry) i.next();    
        Collection value = (Collection) entry.getValue();
        if (value.contains(entity)) {
            return entry.getKey();
        }
    }
    return null;
}

public Object instantiate() {
    return new MultiHashMap();
}

public PersistentCollection instantiate(SessionImplementor session, CollectionPersister persister) throws HibernateException {
    return new PersistentMultiMap(session);
}

public PersistentCollection wrap(SessionImplementor session, Object collection) {
    return new PersistentMultiMap(session, (MultiMap) collection);
}

public Object replaceElements(Object original, Object target, CollectionPersister persister, Object owner, Map copyCache, SessionImplementor session) throws HibernateException {

    MultiMap result = (MultiMap) target;
    result.clear();

    Iterator iter = ( (java.util.Map) original ).entrySet().iterator();
    while ( iter.hasNext() ) {
        java.util.Map.Entry me = (java.util.Map.Entry) iter.next();
        Object key = persister.getIndexType().replace( me.getKey(), null, session, owner, copyCache );
        Collection collection = (Collection) me.getValue();
        for (Iterator iterator = collection.iterator(); iterator.hasNext();) {
            Object value = persister.getElementType().replace( iterator.next(), null, session, owner, copyCache );
            result.put(key, value);
        }
    }

    return result;
}

}

这里也有一些话题:Hibernate中的Multimap

推荐阅读
jerry613
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有