【问题标题】:Assigning a @CollectionId to and @ElementCollection将 @CollectionId 分配给和 @ElementCollection
【发布时间】:2012-11-24 22:08:41
【问题描述】:

我有一个正在尝试实现的类,(类似于“Java Persistence with Hibernate”6.3.3 中的示例)

public class Property
{
    ...

    @ElementCollection(fetch=FetchType.EAGER)
    @CollectionId(
        columns=@Column(name="Property_image_id"),
        type=@Type(type="long"),
        generator="native"
    )
    private Collection<FileAttachment> images = new ArrayList<FileAttachment>();

    ...
}

单元测试失败,抛出以下异常:

java.lang.ClassCastException: org.hibernate.id.IdentifierGeneratorHelper$2 
    cannot be cast to java.lang.Long

我不太确定“发电机”的最佳价值,我认为这会影响结果。

另外,当我开始工作时,FileAttachment 对象可以访问 Property_image_id 吗?以及如何将其分配给属性,因为它是在 Property 类中定义的?

我希望 Property_images 表有一个复合键 [Property_id-Image_index],其中每个新 Property_id 的 Image_index 从 1 开始,但我不知道如何使用 @ElementCollection 和 @CollectionId 来实现它发电机。也许我必须将 FileAttachment 作为 @Entity 而不是 @Embeddable,但 id 而不是作为它仅在 Property 类中使​​用的。

干杯! NFV

【问题讨论】:

    标签: java hibernate


    【解决方案1】:

    来自Java Persistence Wikibook

    JPA 2.0 规范没有提供定义 Id 的方法 可嵌入的。但是,要删除或更新 ElementCollection 映射,通常需要一些唯一键。 否则,在每次更新时,JPA 提供者都需要删除 实体的 CollectionTable 中的所有内容,然后插入 值回来了。因此,JPA 提供者很可能会假设 Embeddable 中所有字段的组合都是唯一的,在 与外键 (JoinColumn(s)) 组合。然而这可以 效率低下,或者如果 Embeddable 很大则不可行,或者 复杂的。一些 JPA 提供程序可能允许在 嵌入式,解决这个问题。请注意,在这种情况下,ID 只需要 对于集合而不是表来说是唯一的,因为外键是 包括。有些可能还允许 CollectionTable 上的唯一选项 用于此。否则,如果您的 Embeddable 很复杂,您可以 考虑将其设为实体并改用 OneToMany。

    我认为您的IMAGE_INDEX 要求可以通过OrderColumns 解决:

    @ElementCollection(fetch=FetchType.EAGER)
    @OrderColumn(name = "IMAGE_INDEX")
    private List<FileAttachment> images;
    

    This post 可能有用。

    【讨论】:

    • 看起来可嵌入的 id 是依赖于实现的。无论如何,也许@OrderColumn 将是我正在寻找的东西,我试试吧!顺便问一下,你知道order列在从hibernate加载后是否可以被子对象访问?
    • 我从未尝试过映射OrderColumn(因为它只是父列表中元素的索引,可以使用List.indexOf轻松检索。无论如何,您可以尝试@987654328 @,如果有效,请发布结果。
    • OrderColumn 效果很好,谢谢!按照您的建议通过 Column 访问图像索引不起作用。我认为我必须忘记注释并退回到老式代码(我知道这令人震惊),并在子对象中执行类似的操作:return parent.images.indexOf(this);
    【解决方案2】:

    我想你应该为生成器提供一个实现。我们可以使用“序列”生成器。

    试试这个:

    @GenericGenerator(name="myGenerator",strategy="sequence")
    @CollectionId(
        columns=@Column(name="Property_image_id"),
        type=@Type(type="long"),
        generator="myGenerator"
    )
    

    【讨论】:

      猜你喜欢
      • 2019-06-14
      • 2014-11-01
      • 2011-03-16
      • 1970-01-01
      • 1970-01-01
      • 2013-10-15
      • 2018-01-26
      • 2016-03-28
      • 2011-01-09
      相关资源
      最近更新 更多