Hibernate: Collections of Collections

前端 未结 1 1283
长情又很酷
长情又很酷 2021-02-04 02:09

This is a problem I keep on running into:

I would like to have hibernate manage a single table that represents a collection of collections. For example:

  • a
1条回答
  •  不知归路
    2021-02-04 03:13

    Found the answer on https://xebia.com/blog/mapping-multimaps-with-hibernate/

    This is a long blog post from 11 years ago. The key code is:

    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;
    }
    

    }

    There was also some talk over here: Multimap in Hibernate

    0 讨论(0)
提交回复
热议问题