是否可以映射地图<string,list <entity>&gt;在JPA?</string,list <entity>

时间:2012-03-20 09:22:27

标签: java jpa jpa-2.0

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

我的问题是,是否有可能在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 有一些技巧来支持这一点,但我没有测试它。我的猜测是 - 不。

答案 1 :(得分:0)

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

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