【问题标题】:JPA 2: mapping a map where the key is an entity, value is BooleanJPA 2:映射键是实体,值是布尔值的映射
【发布时间】:2012-03-19 13:13:22
【问题描述】:

我们正在尝试映射关系,其中一个实体具有一个映射,其中键是另一个实体,值是布尔值:

    @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,而不是 Boolean。

approvals.get(testApproval); // returns a BigDecimal :-(

有什么不正确的地方吗?是我们,还是 Eclipselink 的 bug?

编辑: 试过这个(批准有 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,结果相同。

【问题讨论】:

  • 这太奇怪了。对我来说绝对看起来像一个错误。 APPROVALS_PRODUCT_APPROVALS 表的 DDL 是什么?
  • @ymajoros 映射与布尔值一起工作正常,我认为 Eclipselink 中没有错误。我在 eclipse 中试过这个。你能发布你的迭代器代码来获得批准键集吗?
  • @Tom 表是 eclipselink 在启动时生成的
  • @Riddhish 这肯定有问题。我什至没有迭代器,只是做了一个approvals.get(someApproval) 并有一个BigDecimal 实例。使用 Eclipselink 2.1.1
  • @DataNucleus docs.oracle.com/javaee/6/api/javax/persistence/… 示例 2 似乎暗示这是可能的。我们尝试指定 MapKeyJoinColumn,但收到关于缺少 JoinColumns 的奇怪错误

标签: java jakarta-ee jpa jpa-2.0


【解决方案1】:

你的代码错了,

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

如果您希望 Map 键成为另一个对象,您还需要一个 @MapKeyJoinColumn(如果它是一个可嵌入对象,则需要 @MapKeyClass。

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

【讨论】:

  • 好的,使用了转换器/转换。唯一的问题是,这是 Eclipselink 特有的,在我们的项目中是禁止的。我想我会记录一个错误。有机会在下一个 JPA 修订版中获得标准的 Convert 注释吗?
猜你喜欢
  • 2011-07-13
  • 2012-02-02
  • 2011-04-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多