私はSOを検索し、これに対して適切な解決策を見つけられませんでした。私は親エンティティを持っていると言う:春JPAの新しい子エンティティの親エンティティ
@Entity
public class Parent {
@Id
@GeneratedValue
private int id;
@OneToMany(mappedBy = "parent", cascade = CascadeType.REMOVE)
private List<Child> childList;
}
と親エンティティに関連する外部キーを持っている子エンティティ、:
@Entity
public class Child {
@Id
@GeneratedValue
private int id;
@JoinColumn(name = "parentId")
@ManyToOne(cascade = {CascadeType.PERSIST, CascadeType.MERGE})
private Parent parent;
}
私のシナリオは少し特殊です。子エンティティは1時間に膨大な量で生成され、データベースに保存する必要があります。これらの子オブジェクトは同じ親を持ち、関連親エンティティはすでにデータベースに存在している可能性があります。私の要件は、entityManagerからマネージ親エンティティを問合せせずにこれらの子オブジェクトをすべて保存することです。親エンティティが存在する場合は、既存のエンティティをマージ/更新するだけです。例:
Child c = new Child();
// set some properties of child
Parent p = new Parent();
// set some properties from my data into the parent. The parent may already exists
child.setParent(p);
JpaRepo.saveAndFlush(child);// If parent already exists, merge with the existed parent object, otherwise, create new parent object.
明らかにこれは機能しません。親エンティティが存在しない場合、親エンティティを正しく作成して関連付けます。しかし、親がすでに存在する場合、重複キーに関する例外がスローされ、親のId(ダミー値を使用して強制的にマージを行う)を設定すると、分離されたエンティティオブジェクトの例外がスローされます。
パフォーマンス制約のため、あまりにも多くのものがあるので、私はデータベースから親エンティティを読み込むことができません。したがって、プライマリキーが違反したときにオブジェクトをマージするJPAまたはデータベースを自動的に作成する方法はありますか?
私はMySQLを使用していますが、重複したキー更新を使用することは可能ですか?
保存する前に、子オブジェクトで使用可能な親のIDがありますか? –
いいえ、私はidを持っていませんが、代わりに、オブジェクトを識別するためのユニークなキーとして使用できるすべての属性を持っています。 – LynxZh