有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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) 个答案

  1. # 1 楼答案

    你的代码错了

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

    如果希望映射键是另一个对象,则还需要@MapKeyJoinColumn(如果它是可嵌入的,则需要@MapKeyClass)

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