JPA 2:映射键是实体的映射,值是布尔值

时间:2012-03-19 13:13:23

标签: java java-ee jpa jpa-2.0

我们正在尝试映射一个实体具有地图的关系,其中该关键字是另一个实体,并且该值是布尔值:

    @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,结果相同。

1 个答案:

答案 0 :(得分:1)

你的代码错了,

ElementCollection上的targetClass用于指定Embeddable类(如果未使用泛型),因此不应使用。

如果你想让Map键成为另一个对象(或@MapKeyClass,如果它是一个Embeddable),你还需要一个@MapKeyJoinColumn。

大多数数据库没有布尔类型,因此布尔值通常存储为数字0/1。所以你可能会以某种方式错过转换。你可以用@TypeConverter定义一个@Convert,虽然它应该是默认的,所以你可以记录一个bug。