【问题标题】:Is it possible to map a map<String,List<Entity>> in JPA?是否可以在 JPA 中映射 map<String,List<Entity>> ?
【发布时间】:2012-04-04 18:15:23
【问题描述】:

我在想如果我使用像 Map&lt;String,List&lt;Entity&gt;&gt;Map&lt;Long,List&lt;Entity&gt;&gt; 这样的地图,它会帮助我做一些事情,但我找不到任何例子来映射这种地图。

我的问题是,是否可以在 JPA 标准中进行这种映射,我应该使用哪种注释?

【问题讨论】:

标签: java jpa jpa-2.0


【解决方案1】:

答案显然是否定的,根据link 在原始帖子的评论中,我还可以确认它在我尝试过的 Eclipselink 中不起作用。

我尝试做一个嵌套的 Map> ,其中 key 是 ISO2 语言代码,这将有助于仅检索满足当前语言上下文的特定子关系子集。

类似这样的:

public class ProductEntity {

  @MapKey(name = "language")
  @OneToMany(mappedBy = "product", cascade = CascadeType.ALL, orphanRemoval = true,   fetch = FetchType.LAZY)
  private Map<String, List<AttributeEntity>> attributes;

}

public class AttributeEntity {

  private String language;

  @ManyToOne
  @JoinColumn(name="product_id")
  private ProductEntity product;
}

当您需要检索特定语言的属性(例如来自 REST Accept-Language 标头)时,这将很有用,因为您可以只使用getAttributes().get(currentLanguage) 而不是编写 NamedQueries 或进行流过滤。

至少对于 Eclipselink,我在尝试此操作时遇到了一个无意义的错误:

IllegalArgumentException:对象: [com.my.project.AttributeEntity@745f] 不是已知的实体类型。

也许 Hibernate 有一些技巧来支持这一点,但我没有测试它。我的猜测是 - 不。

【讨论】:

    【解决方案2】:

    是的,可以创建其中任何一个地图。为什么不尝试并回答您自己的问题呢?比在这里被动询问要快。

    对于 JPA,我建议使用比 Map 更好的抽象来保存该数据。这对我来说太笼统了。这可能是您想要的,但 JPA ORM 应该映射到比集合更健壮的对象模型。

    【讨论】:

      猜你喜欢
      • 2010-10-25
      • 2014-06-25
      • 2019-11-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-14
      相关资源
      最近更新 更多