【发布时间】:2012-04-04 18:15:23
【问题描述】:
我在想如果我使用像 Map<String,List<Entity>> 或 Map<Long,List<Entity>> 这样的地图,它会帮助我做一些事情,但我找不到任何例子来映射这种地图。
我的问题是,是否可以在 JPA 标准中进行这种映射,我应该使用哪种注释?
【问题讨论】:
我在想如果我使用像 Map<String,List<Entity>> 或 Map<Long,List<Entity>> 这样的地图,它会帮助我做一些事情,但我找不到任何例子来映射这种地图。
我的问题是,是否可以在 JPA 标准中进行这种映射,我应该使用哪种注释?
【问题讨论】:
答案显然是否定的,根据link 在原始帖子的评论中,我还可以确认它在我尝试过的 Eclipselink 中不起作用。
我尝试做一个嵌套的 Map
类似这样的:
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 有一些技巧来支持这一点,但我没有测试它。我的猜测是 - 不。
【讨论】:
是的,可以创建其中任何一个地图。为什么不尝试并回答您自己的问题呢?比在这里被动询问要快。
对于 JPA,我建议使用比 Map 更好的抽象来保存该数据。这对我来说太笼统了。这可能是您想要的,但 JPA ORM 应该映射到比集合更健壮的对象模型。
【讨论】: