JavaJPA2:映射一个映射,其中键是实体,值是布尔值
我们试图映射一个关系,其中一个实体有一个映射,其中键是另一个实体,值是布尔值:
@Id Long id;
@ElementCollection
@CollectionTable(name = "APPROVALS_PRODUCT_APPROVALS", joinColumns = @JoinColumn(name = "PRODUCT_APPROVAL_ID", referencedColumnName = "ID"))
@Column(name = "EXCLUDED")
private Map<Approval, Boolean> approvals = new HashMap<Approval, Boolean>();
出于某种原因,Eclipselink为映射中的每个值提供了一个大十进制,而不是布尔值
approvals.get(testApproval); // returns a BigDecimal :-(
有什么不对劲的吗?这是我们,还是日食中的虫子
编辑: 已尝试此操作(批准有2个@Id字段):
@ElementCollection
@CollectionTable(name = "APPROVALS_PRODUCT_APPROVALS", joinColumns = @JoinColumn(name = "PRODUCT_APPROVAL_ID", referencedColumnName = "ID"))
@Column(name = "EXCLUDED")
@MapKeyJoinColumns({ @MapKeyJoinColumn(name = "CREDENTIAL_VALUE", referencedColumnName = "CREDENTIAL_VALUE"), @MapKeyJoinColumn(name = "CREDENTIAL_TYPE", referencedColumnName = "CREDENTIAL_TYPE") })
private Map<Approval, Boolean> approvals = new HashMap<Approval, Boolean>();
并得到相同的结果(BigDecimal而不是Boolean)
编辑2: 我们正在使用Eclipselink 2.3.0,也尝试了使用2.3.2,得到了相同的结果
# 1 楼答案
你的代码错了
ElementCollection上的targetClass用于指定可嵌入类(如果未使用泛型),因此不应使用
如果希望映射键是另一个对象,则还需要@MapKeyJoinColumn(如果它是可嵌入的,则需要@MapKeyClass)
大多数数据库没有布尔类型,因此布尔值通常存储为数字0/1。所以你可能会错过一次转换。您可以使用@TypeConverter为此定义@Convert,尽管它应该是默认的,所以您可能会为此记录一个bug