使用JPA批注映射java.util.Map时,键和值列名称将被覆盖
我正在研究使用Hibernate 4.1.9和JPA注释对地图进行注释的不同方法。
如果我想存储一个键是实体值属性的Map,则标记看起来像这样
@OneToMany(mappedBy = "deptById", targetEntity = com.demo.impls.Employee.class)
@MapKey(name = "entityId")
private Map<Long, Employee> employeesById;
请注意,上面的标记不会创建联接表,而是在运行时通过查询返回Map,因此Map是动态的,您不必在Java中将元素添加到Map中即可通过查询返回它们。
现在,我希望Map的内容能够反映应用程序添加到Map中的内容,而不是执行动态查询。
我要存储4种地图
private Map<String, String> map0;
private Map<String, Entity> map1;
private Map<Entity, String> map2;
private Map<Entity, Entity> map3;
在这些情况下,键和与值之间没有关系,也与持有实体没有任何关系。我必须能够指定联接表的名称以及键和值的列名称。
我尝试了以下
@Entity
public class Department {
@ElementCollection
@CollectionTable(name = "TEST_MAP0")
@Column(name="value")
@MapKeyColumn(name="Key")
private Map<String, String> map0;
@ElementCollection(targetClass = com.demo.bb.impls.Employee.class)
@CollectionTable(name = "TEST_MAP1")
@Column(name="value")
@MapKeyColumn(name="Key")
private Map<String, Employee> map1;
@ElementCollection
@MapKeyClass(value = com.demo.bb.impls.Employee.class)
@CollectionTable(name = "TEST_MAP2")
@Column(name="value")
@MapKeyColumn(name="Key")
private Map<Employee, String> map2;
@ElementCollection(targetClass = com.demo.bb.impls.ParkingSpace.class)
@MapKeyClass(value = com.demo.bb.impls.Employee.class)
@CollectionTable(name = "TEST_MAP3")
@Column(name="value")
@MapKeyColumn(name="Key")
private Map<Employee, ParkingSpace> map3;
情况0映射工作正常,并且生成的联接表具有列DEPARTMENT,VALUE,KEY
其他三种情况的工作量最大,您可以将数据存储在表中,也可以用Java用相关的键/值查询表并获取预期的结果-
即它确实使用@ElementCollection处理存储实体
但是,当键或值是Entity时,将忽略使用@Column(name =“ value”)&@MapKeyColumn(name =“ key”)覆盖的列名。
我已经尝试过使用@ManyToMany注释,如下所示
@ManyToMany(targetEntity = com.demo.bb.impls.Employee.class)
@JoinTable(name = "TEST_MAP1_B")
@Column(name="value")
@MapKeyColumn(name="Key")
private Map<String, Employee> map1_B;
@ManyToMany(targetEntity = com.demo.bb.impls.ParkingSpace.class)
@MapKeyClass(value = com.demo.bb.impls.Employee.class)
@JoinTable(name = "TEST_MAP3_B")
@Column(name="value")
@MapKeyColumn(name="Key")
private Map<Employee, ParkingSpace> map3_B;
但是,同样会忽略键和值列名称的替代。有人知道强制这些列名覆盖的方法吗?
提前致谢…
更新…。查看来自@wypieprz的响应后,我认为我知道正确的注释,以便在使用具有实体值的基本键映射Map时,可以为值和键指定列名称。
通过使用以下
@ManyToMany(targetEntity = com.demo.bb.impls.Employee.class)
@JoinTable(name = "TEST_MAP1", inverseJoinColumns=@JoinColumn(name="VALUE"))
@MapKeyColumn(name="KEY")
private Map<String, Employee> map1;
使用inverseJoinColumn我可以指定值列名称。
但是,如果键是实体,那么我还没有找到指定键列名称的方法。正如文档所说的,@ MapKeyColumn“指定了地图键为基本类型的地图的键列的映射”
我也不确定当键是Entity且值是基本值时要使用的注释。使用ManyToMany只是行不通&我想我可能不得不使用ElementCollection,但是我仍然找不到指定键列名称的方法。
更新2 …感谢Peter Halicky的解决方案。
总之,在每种情况下命名所有3列,您需要执行以下操作。
@ElementCollection
@CollectionTable(name = "TEST_MAP0", joinColumns = @JoinColumn(name = "DEPARTMENT"))
@Column(name = "value")
@MapKeyColumn(name = "key")
private Map<String, String> map0;
@ManyToMany(targetEntity = com.hibernate.elephants.Employee.class)
@JoinTable(name = "TEST_MAP1", joinColumns = @JoinColumn(name = "DEPARTMENT"), inverseJoinColumns = @JoinColumn(name = "value"))
@MapKeyColumn(name = "key")
private Map<String, Employee> map1;
@ElementCollection
@CollectionTable(name = "TEST_MAP2", joinColumns = @JoinColumn(name = "DEPARTMENT"))
@MapKeyClass(value = com.hibernate.elephants.Employee.class)
@MapKeyJoinColumn(name = "key")
@Column(name = "value")
private Map<Employee, String> map2;
@ManyToMany(targetEntity = com.hibernate.elephants.ParkingSpace.class)
@JoinTable(name = "TEST_MAP3", joinColumns = @JoinColumn(name = "DEPARTMENT"), inverseJoinColumns = @JoinColumn(name = "value"))
@MapKeyClass(value = com.hibernate.elephants.Employee.class)
@MapKeyJoinColumn(name="key")
private Map<Employee, com.hibernate.elephants.ParkingSpace> map3;
请注意,有两种情况指定为ElementCollection,但是这两种情况是值是另一个Entity,则需要使用ManyToMany。
-
我将实体用作地图的键,如下所示。使用@MapKeyJoinColumn批注,我可以指定作为地图键的列的名称。这对我在Hibernate上起作用,不确定其他JPA实现会做什么,但是确实值得尝试。
@ElementCollection @CollectionTable(name="breed_descriptions", joinColumns={ @JoinColumn(name="breed") }) @Column(name="description") @MapKeyJoinColumn(name="language") private Map<Language, String> descriptions = new HashMap<>();
-
使用Jersey / JAXB / Jackson将Java.util.Map映射到JSON对象
2021-01-31 关注 0 浏览74 1答案
-
java.util.Map的交集
2021-01-31 关注 0 浏览72 1答案
-
如何使用JPA将Map(java.util.Map)对象持久保存在实体中并确保持久性级联?
2021-02-01 关注 0 浏览99 1答案
-
如何使用JPA将Map(java.util.Map)对象持久保存在实体中,并确保持久性级联?
2021-01-30 关注 0 浏览106 1答案
-
JAXB java.util.Map绑定
2021-01-30 关注 0 浏览92 1答案
-
如何在Java中将java.util.Map转换为scala.collection.immutable.Map?
2021-01-29 关注 0 浏览123 1答案
-
寻找替代java.util.Map的替代品
2021-01-29 关注 0 浏览123 1答案
-
如何从休眠查询中获取java.util.Map?
2021-02-01 关注 0 浏览87 1答案
-
下面哪个选项没有实现 java.util.Map 接口?
2021-10-12 关注 0 浏览1442 1答案
-
从json编码/解码到java.util.Map的库?
2021-01-31 关注 0 浏览91 1答案