Java 如何持久化地图<;字符串,列表<;对象>&燃气轮机;冬眠
我有一个Java 如何持久化地图<;字符串,列表<;对象>&燃气轮机;冬眠,java,hibernate,jpa,persistence,h2,Java,Hibernate,Jpa,Persistence,H2,我有一个Map包含MyObject实例。MyObject类使用JPA保存其字段: @OneToMany(cascade = CascadeType.ALL) @LazyCollection(LazyCollectionOption.FALSE) private Map<String, MyObject> results = new HashMap<String, MyObject>(); 但启动后,我们会收到堆栈跟踪: Caused by: org.hibernate.
Map
包含MyObject
实例。MyObject
类使用JPA保存其字段:
@OneToMany(cascade = CascadeType.ALL)
@LazyCollection(LazyCollectionOption.FALSE)
private Map<String, MyObject> results = new HashMap<String, 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不支持持久化包含(作为值)
列表
类型的映射吗?还是我的注释不正确?我在任何文档或示例中都没有发现这种特殊的配置。我个人认为这不是Hibernate的好用法。这里没有抽象概念。如果您有一个具有一对多关系的模型对象,并将其作为父对象中的数据成员表示为子列表,那么这是有意义的
我的建议?不要使用Hibernate。使用纯JDBC、Spring的JDBC模板或类似iBatis的东西
ORM代表“对象关系映射”。有了表,就有了关系部分。您可以将数据分配给表中的列
但我觉得你好像没有东西。那么为什么要使用Hibernate呢?存储在映射中的对象必须是oneToMany关联(始终映射)的目标对象。您不能在那里存储任意对象或集合。MyObject是JPA映射类吗?@ToddMurray:必须是,否则OP将不会收到关于MyObject.results
字段如何注释为@OneToMany
的错误消息。是的,MyObject的实例当前存储在Hibernate中。但是现在,不再使用String->MyObject来存储映射,而是使用String->list来存储映射。请考虑改进您的域对象。是否确实要存储列表?如果你有一个单独的类保存一个列表,然后将其存储在地图中,你的系统会改进吗?@Jochen:这正是我的观点。谢谢。我们在Hibernate中存储了许多其他关系。我们目前正在两个数据模型之间进行迁移,因此我们正在进行实验,以确定Hibernate如何构造数据库,以及我们需要在SQL/迁移脚本中包含哪些内容来适应这些更改。这些课程/关系不是最终的,但感谢您提供的提示。:)也许你可以混合搭配。您的持久性层不一定都是一种技术。使用有意义的方法。谢谢,听起来这个问题可以通过其他一些注释建议来缓解——主要是将列表封装到另一个类中,并将该类作为值存储在映射中。
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