複合キーによる@OneToManyの関係

私は以下のモデルを持っています(setterやgettersのような無関係な/明らかなコードは無視します)。

@Entity
public class Invoice {
    @Id//sequence generated
    private Long invoiceId;

    @OneToMany(fetch = FetchType.EAGER)
    @JoinColumn(name = "invoiceId", referencedColumnName = "invoiceId")
    @OrderBy("id.itemNumber")
    List items = new ArrayList();
}


@Entity
public class Item {
    @EmbeddedId
    private ItemPK id;
}


@Embeddable
public class ItemPK {
    private Long invoiceId;
    private Long itemNumber;
}

それはレガシーDBのように、DB構造を変更することはできません:(

itemNumberは基本的にゼロから始まるインデックスです。

既存の請求書を取り除いて既存のアイテムを削除し、リストに2つの新しいアイテムを追加すると、請求書オブジェクトを更新しようとするときに次のような問題が発生します。

If I leave the ItemPK null, I get: org.hibernate.TransientObjectException: object is an unsaved transient instance - save the transient instance before merging

org.hibernate.NonUniqueObjectException:同じ識別子の値を持つ別のオブジェクトがすでにセッションに関連付けられていた場合、ItemPKの値(インボイスのIDとインデックス)を自分で埋めようとすると、 (すでに請求書項目がDBにあり、新しい商品リストの最初のオブジェクトと同じように、請求書IDとインデックス= 0があります)。

If I try to leave the invoiceId null (in the ItemPK object), I get: java.sql.BatchUpdateException: ORA-01400: cannot insert NULL into ("Item"."invoiceId")

Hibernate/JPAにこれを処理させるためにとにかくありますか? または、関連付けを完全に削除し、リストを@Transientとして定義し、それを入力してサービスクラスに保存する必要がありますか?

ありがとう。

0

1 答え

ItemエンティティのinvoiceIdは実際に請求書の外部キーであるため、ここでは双方向の関連付けを効果的に行います。したがって、関連付けを双方向のものとしてマップし、 < code> @MapsId アノテーションを追加します。そのjavadocには例があります。

1
追加された
私は同様の問題があり、これを使用しようとしましたが、動作させることができませんでした: stackoverflow.com/questions/31600142/…
追加された 著者 amphibient,