分配@CollectionId和@ElementCollection

时间:2012-12-06 19:30:23

标签: java hibernate

我有一个我试图实现的类(类似于'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],其中Image_index从1开始为每个新的Property_id但我不知道如何使用@ElementCollection和@CollectionId来实现它发电机。也许我必须将FileAttachment作为@Entity而不是@Embeddable,但id而不是它仅在Property类中使用。

干杯! NFV

2 个答案:

答案 0 :(得分:2)

来自Java Persistence Wikibook

  

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

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

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

This post可能有用。

答案 1 :(得分:1)

我想你应该为生成器提供一个实现。我们可以使用&#34; sequence&#34;发电机。

尝试一下:

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