gpt4 book ai didi

java - Hibernate:集合的集合

转载 作者:IT老高 更新时间:2023-10-28 20:54:33 25 4
gpt4 key购买 nike

这是我一直遇到的问题:

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

  • map map
  • 集合列表
  • 列表 map

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

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 代码,这似乎是不可能的,我不介意。但我希望有人对自定义代码的外观有一些指导。

  • 我应该扩展 AbstractPersistentCollection 吗?
  • 复合用户类型?

如果多个表都可以,则可以进行管理。但从 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;
}

}

这里也有一些讨论:Multimap in Hibernate

关于java - Hibernate:集合的集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/545047/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com