【发布时间】:2012-03-06 05:43:54
【问题描述】:
我有一个 Map 包含 MyObject 实例。 MyObject 类使用 JPA 来持久化其字段:
@OneToMany(cascade = CascadeType.ALL)
@LazyCollection(LazyCollectionOption.FALSE)
private Map<String, MyObject> results = new HashMap<String, MyObject>();
我们将Map 存储的值更改为List:
private Map<String, List<MyObject>> results = new HashMap<String, List<MyObject>>();
但是在启动时我们会收到一个堆栈跟踪:
Caused by: org.hibernate.AnnotationException: Use of @OneToMany or @ManyToMany targeting an unmapped class: com.me.myapp.MyObject.results[java.util.List]
at org.hibernate.cfg.annotations.CollectionBinder.bindManyToManySecondPass(CollectionBinder.java:1150)
at org.hibernate.cfg.annotations.CollectionBinder.bindStarToManySecondPass(CollectionBinder.java:680)
at org.hibernate.cfg.annotations.MapBinder$1.secondPass(MapBinder.java:107)
at org.hibernate.cfg.CollectionSecondPass.doSecondPass(CollectionSecondPass.java:66)
at org.hibernate.cfg.Configuration.secondPassCompile(Configuration.java:1221)
at org.hibernate.cfg.AnnotationConfiguration.secondPassCompile(AnnotationConfiguration.java:383)
at org.hibernate.cfg.Configuration.buildMappings(Configuration.java:1206)
at org.springframework.orm.hibernate3.LocalSessionFactoryBean.buildSessionFactory(LocalSessionFactoryBean.java:673)
at org.springframework.orm.hibernate3.AbstractSessionFactoryBean.afterPropertiesSet(AbstractSessionFactoryBean.java:211)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1368)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1334)
... 30 more
Hibernate 不支持持久化包含(作为值)List 类型的 Map 吗?还是我的注释不正确?我没有在任何文档或示例中找到此特定配置。
【问题讨论】:
-
MyObject 是 JPA 映射类吗?
-
@ToddMurray:必须是这样,否则 OP 将不会收到有关
MyObject.results字段如何注释为@OneToMany的错误消息。 -
是的,MyObject 的实例当前存储在 Hibernate 中。但是现在不是用 String->MyObject 存储 Map,而是 Map 应该是 String->List
-
考虑改进您的域对象。您真的要存储 List
吗?如果您有一个单独的类来保存 List 然后将其存储在地图中,您的系统会改进吗? -
@Jochen:正是我的观点。谢谢。
标签: java hibernate jpa persistence h2