我有 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/