4

実装しようとしているクラスがあります(「Hibernateを使用したJava Persistence」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

'generator'の最適な値についてはよくわかりませんが、これが結果に影響すると思います。

また、これが機能するようになると、FileAttachmentオブジェクトはProperty_image_idにアクセスできますか?また、Propertyクラスで定義されているので、どのようにプロパティに割り当てますか?

私が欲しいのは、Property_imagesテーブルに複合キー[Property_id-Image_index]を持たせることです。ここで、Image_indexは新しいProperty_idごとに1から始まりますが、ジェネレーターで@ElementCollectionと@CollectionIdを使用してこれを実装する方法がわかりません。たぶん私はFileAttachmentを@Embeddableではなく@Entityとして持つ必要がありますが、Propertyクラス内でのみ使用されるものとしてではなくidを持っている必要があります。

乾杯!NFV

4

2 に答える 2

2

Java Persistence Wikibookから:

JPA 2.0仕様は、EmbeddableでIDを定義する方法を提供していません。ただし、ElementCollectionマッピングの要素を削除または更新するには、通常、いくつかの一意のキーが必要です。そうしないと、更新のたびに、JPAプロバイダーはエンティティのCollectionTableからすべてを削除してから、値を挿入し直す必要があります。したがって、JPAプロバイダーは、Embeddableのすべてのフィールドの組み合わせが、外部キー(JoinColumn(s))と組み合わせて一意であると想定する可能性があります。ただし、これは非効率的であるか、埋め込み可能が大きいか複雑な場合は実行不可能になる可能性があります。一部のJPAプロバイダーは、この問題を解決するために、EmbeddableでIDを指定することを許可する場合があります。この場合、外部キーが含まれているため、IDはテーブルではなく、コレクションに対して一意である必要があることに注意してください。また、CollectionTableの一意のオプションをこれに使用できる場合もあります。それ以外の場合、埋め込み可能オブジェクトが複雑な場合は、それをエンティティにして、代わりにOneToManyを使用することを検討してください。

私はあなたの要件がOrderColumnsIMAGE_INDEXで取り組むことができると思います:

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

この投稿は役に立つかもしれません。

于 2012-12-06T19:47:51.270 に答える
2

ジェネレーターの実装を提供する必要があると思います。「シーケンス」ジェネレーターを使用できます。

これを試してみてください:

@GenericGenerator(name="myGenerator",strategy="sequence")
@CollectionId(
    columns=@Column(name="Property_image_id"),
    type=@Type(type="long"),
    generator="myGenerator"
)
于 2016-11-27T04:37:21.523 に答える