【问题标题】:How to persist a Map<String, List<Object>> in Hibernate如何在 Hibernate 中持久化 Map<String, List<Object>>
【发布时间】: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


【解决方案1】:

映射中存储的对象必须是 oneToMany 关联的目标对象(始终映射)。您不能在其中存储任意对象或集合。

【讨论】:

  • 谢谢,听起来这个问题可以通过其他一些评论建议得到缓解 - 主要是将 List 封装到另一个类中,并将该类作为值存储在 Map 中。
【解决方案2】:

就个人而言,我不认为这是对 Hibernate 的一个很好的使用。这里没有 no 抽象。如果您有一个具有一对多关系的模型对象,将其表示为子列表作为父项中的数据成员,那将是有意义的。

我的建议?不要使用休眠。使用直接的 JDBC、Spring 的 JDBC 模板或类似 iBatis 的东西。

ORM 代表“对象关系映射”。你有表,所以你有关系部分。您可以将数据分配给表中的列。

但在我看来你没有对象。那么为什么要使用 Hibernate?

【讨论】:

  • 我们在 Hibernate 中存储了许多其他关系。我们目前正在两个数据模型之间迁移,因此我们正在尝试确定 Hibernate 如何构建数据库,以及我们需要在 SQL/迁移脚本中包含哪些内容以适应这些更改。这些课程/关系不是最终的,但感谢您的提示。 :)
  • 也许你可以混搭。您的持久层不必是一种技术。使用有意义的东西。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-22
  • 2016-11-26
  • 2016-11-29
  • 1970-01-01
  • 2020-08-01
  • 1970-01-01
相关资源
最近更新 更多