我有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用这个“嵌套属性”创建我的地图?
*对不起我的英语,如果你理解我需要的话,请随意,并且可以用英语更好地编写我的问题。
答案 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。);