【问题标题】:JPA MapKey with Nested Attributes具有嵌套属性的 JPA MapKey
【发布时间】:2016-02-22 15:58:04
【问题描述】:

我有 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;
  ...
}

我的问题是,我希望 Company 的 ID 作为我在 ItemType 中的地图的键。

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

公司正在正确加载到地图中,只是地图键错误。我试过谷歌,找不到任何东西。 JPA有什么方法可以用这个“嵌套属性”创建我的地图吗?

*对不起我的英语,如果你明白我的需要并且可以用更好的英文写作来编辑我的问题,请随意。

【问题讨论】:

  • 我怀疑大多数人只会使用公司实例本身作为地图键。
  • 可能是一个解决方案,具体取决于 equals() 和 hash() 实现以及对象内部填充的数据,否则 map 上的“get()”操作可能不会返回您的对象...跨度>

标签: java jpa eclipselink


【解决方案1】:

这并不能完全解决问题,但暂时解决了我的需求。

由于公司的 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是将“Key Information”设为ReadOnly,避免映射冲突,因为ItemTypePurpose使用同一列映射Entity。

不完全是一个答案,而是“解决”以解决我的需求。如果您想要一个字段作为 ID 以外的 Map Key,此解决方案不适用。

【讨论】:

    【解决方案2】:

    回复较晚,但可能对其他人有所帮助。

    @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,默认名称 属性是 IMAGE_KEY。

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

    ItemType.getPurposeHash().put(ItemTypePurpose.getCompany().getId(), ItemTypePurpose);

    【讨论】:

      猜你喜欢
      • 2017-04-19
      • 1970-01-01
      • 2019-09-25
      • 1970-01-01
      • 2011-02-19
      • 2016-01-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多