我们正在尝试映射一个实体具有地图的关系,其中该关键字是另一个实体,并且该值是布尔值:
@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为地图中的每个值提供了一个BigDecimal,而不是布尔值。
approvals.get(testApproval); // returns a BigDecimal :-(
有什么不合适的吗?这是我们,还是Eclipselink中的一个错误?
编辑: 试过这个(Approval有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)
EDIT2: 我们正在使用Eclipselink 2.3.0,也尝试使用2.3.2,结果相同。
答案 0 :(得分:1)
你的代码错了,
如果你想让Map键成为另一个对象(或@MapKeyClass,如果它是一个Embeddable),你还需要一个@MapKeyJoinColumn。
大多数数据库没有布尔类型,因此布尔值通常存储为数字0/1。所以你可能会以某种方式错过转换。你可以用@TypeConverter定义一个@Convert,虽然它应该是默认的,所以你可以记录一个bug。