jpa java.util.map_使用JPA批注映射java.util.Map时,键和值列名称将被覆盖

我正在研究使用Hibernate 4.1.9和JPA注释对地图进行注释的不同方法。

如果我想存储一个键是实体值属性的Map,则标记看起来像这样

@OneToMany(mappedBy = "deptById", targetEntity = com.demo.impls.Employee.class)

@MapKey(name = "entityId")

private Map employeesById;

请注意,上面的标记不会创建联接表,而是在运行时通过查询返回Map,因此Map是动态的,您不必在Java中将元素添加到Map中即可通过查询返回它们。

现在,我希望Map的内容能够反映应用程序添加到Map中的内容,而不是执行动态查询。

我要存储4种地图

private Map map0;

private Map map1;

private Map map2;

private Map map3;

在这些情况下,键和与值之间没有关系,也与持有实体没有任何关系。我必须能够指定联接表的名称以及键和值的列名称。

我尝试了以下

@Entity

public class Department {

@ElementCollection

@CollectionTable(name = "TEST_MAP0")

@Column(name="value")

@MapKeyColumn(name="Key")

private Map map0;

@ElementCollection(targetClass = com.demo.bb.impls.Employee.class)

@CollectionTable(name = "TEST_MAP1")

@Column(name="value")

@MapKeyColumn(name="Key")

private Map map1;

@ElementCollection

@MapKeyClass(value = com.demo.bb.impls.Employee.class)

@CollectionTable(name = "TEST_MAP2")

@Column(name="value")

@MapKeyColumn(name="Key")

private Map 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 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 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 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 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 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 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 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 map3;

请注意,有两种情况指定为ElementCollection,但是这两种情况是值是另一个Entity,则需要使用ManyToMany。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值