具有嵌套属性的JPA MapKey

时间:2016-02-22 15:58:04

标签: java jpa eclipselink

我有3个这样的元素:

public class ItemType {
  @Id
  private Long id = null;
  ...
  @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, orphanRemoval = true, mappedBy = "itemTypeVO")
  @MapKey(name = "company.id")
  private Map<Long, ItemTypePurpose> purposeHash = null;
  ...
}


public class ItemTypePurpose {
  @Id
  private Long id = null;
  ...
  @ManyToOne(fetch = FetchType.LAZY, optional = false)
  @JoinColumn(name = "idcompany")
  private Company company = null;
  ...
}

public class Company {
  @Id
  private Long id = null;
  ...
}

我的问题是,我希望公司的ID作为我在MapType中的地图的关键。

我可以编译和部署应用程序而不会出现任何错误。可以持久化ItemType,一切顺利到DB。但是当我收回它时,Map键是“错误的”,我不知道正在使用什么信息,但肯定不是公司ID。也许是ItemTypePurpose的ID。

正确地将公司加载到Map中,只是地图键错误。我试过google,bu找不到任何东西。有没有办法让JPA用这个“嵌套属性”创建我的地图?

*对不起我的英语,如果你理解我需要的话,请随意,并且可以用英语更好地编写我的问题。

2 个答案:

答案 0 :(得分:0)

这并没有完全解决问题,但现在解决了我的需求。

由于公司的Que ID在ItemTypePurpose的表中,我可以将MapKey更改为:

public class ItemType {
  @Id
  private Long id = null;
  ...
  @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, orphanRemoval = true, mappedBy = "itemTypeVO")
  @MapKeyColumn(name = "idcompany", insertable = false, updatable = false)
  private Map<Long, ItemTypePurpose> purposeHash = null;
  ...
}

我使用@MapKeyColumn而不是@MapKey。 @MapKeyColumn(name = "idcore_company", insertable = false, updatable = false用于转换关键信息&#34; ReadOnly并避免映射冲突,因为在ItemTypePurpose中使用相同的列来映射实体。

不完全是一个答案,但是&#34;解决了#34;解决我的需求。如果您希望将字段设置为除ID之外的Map Key,则此解决方案不会涵盖。

答案 1 :(得分:0)

迟回复,但可以对其他人有所帮助。

@MapKeyColumn 似乎是这里的官方解决方案。根据文档,似乎要使用的注释取决于 Map 的键类型,而不管映射的字段如何。在您的情况下,密钥类型是 Long,因此以下将适用:

https://docs.oracle.com/cd/E19226-01/820-7627/giqvn/index.html

<块引用>

在实体中使用地图集合

<块引用>

实体元素的集合和 关系可以由 java.util.Map 集合表示。一张地图 由键和值组成。

如果 Map 的键类型是 Java 编程语言基本类型, 使用 javax.persistence.MapKeyColumn 注解来设置列 键的映射。默认情况下,@MapKeyColumn 的 name 属性 是 RELATIONSHIP FIELD/PROPERTY NAME_KEY 的形式。例如,如果 在引用关系字段名称为图像,默认名称 属性为 IMAGE_KEY。

总结: 对于嵌套字段,请使用 MapKeyColumn(name="myNestFiled_key"),然后您将在代码中手动设置该值,例如:

ItemType.getPurposeHash()把(ItemTypePurpose.getCompany()的getId(),ItemTypePurpose。);