Hibernate:集合的集合

这是我一直遇到的问题:

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

  • 地图地图
  • 套装清单
  • 列表地图

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

 class OwningClass {  
    长实体;  
     Map <String,List > mapOfLists;
 }

 class Element {
     String data_1;
    布尔数据_2;
 }

作为单个表:

 OWNER(此元素所有者的外键)MAP_KEY(varchar(30))LIST_INDEX(int)ELEMENT_DATA_1(varchar(1020)ELEMENT_DATA_2(bit) 

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

  • 我应该扩展AbstractPersistentCollection吗?
  • CompositeUserType?

它可以管理多个表是否正常,但显然从db角度来看是蹩脚的。

在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