Pat*_*Pat 20 java collections hibernate
这是我一直遇到的问题:
我想让hibernate管理一个代表集合集合的表.例如:
例如,我希望能够代表这一点:
class OwningClass {
Long entityId;
Map<String, List<Element>> 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代码似乎不可能,我不介意.但我希望有人对自定义代码的外观有一些指导.
如果多个表都可以,那么可以管理它,但很明显,从db的角度来看,它是蹩脚的.
Pat*_*Pat 10
在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;
}
Run Code Online (Sandbox Code Playgroud)
}
这里也有一些话题:Hibernate中的Multimap