我有一个我试图实现的类(类似于'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
答案 0 :(得分:2)
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"
)