java - 具有嵌套属性的 JPA MapKey

标签 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;
  ...
}

我的问题是,我希望 Company ID 作为 ItemType 内 map 的键。

我可以毫无错误地编译和部署应用程序。可以持久化ItemType,并且一切顺利到DB。但是当我拿回来时, map 键是“错误的”,我不知道正在使用什么信息,但可以肯定它不是公司ID。也许是 ItemTypePurpose 的 ID。

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

*抱歉我的英语不好,如果您了解我的需要并且可以更好地用英语写作来编辑我的问题,请随意。

最佳答案

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

由于公司的 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 是将“关键信息”只读并避免映射冲突,因为 ItemTypePurpose 中使用相同的列来映射实体。

不完全是一个答案,但“解决”了我的需求。如果您想要一个字段作为除 ID 之外的映射键,则此解决方案不涵盖。

关于java - 具有嵌套属性的 JPA MapKey,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35558119/

相关文章:

java - 我可以只创建一个 DateTimeFormatter 的静态实例吗

java - 如何使用 Criteria API 根据不同的条件查找特定人员?

java - 如何使用 hibernate JPA 注释连接两列

java - 类似子句 JPQL 中的参数

java - 只有当查询包含 FIRST_ROWS 或 ROWNUM 限制时,ResultSet.next 才会非常慢

Java如何对IP地址列表进行排序

java - 无 Intent 的刷新 Activity

java - JPA 2.0/EclipseLink 和 sqlite 3.7.2 - 无法创建表

java - PersistenceUnit 的预部署因 EclipseLink 而失败

Java 泛型 : why does this nested template fail?