私は3つのエンティティを持っています。それをA、B、Cと呼ばないようにし、IDの組み合わせである複合キーを持つ4番目のものと呼びます。
@Entity
public class A {
@Id
@GeneratedValue(generator = "generator")
private String id;
}
@Entity
public class B {
@Id
@GeneratedValue(generator = "generator")
private String id;
}
@Entity
public class C {
@Id
@GeneratedValue(generator = "generator")
private String id;
@OneToMany(cascade = CascadeType.ALL, mappedBy = "c", fetch = FetchType.LAZY)
private List<ClassWithCompositeKey> relations = new ArrayList<ClassWithCompositeKey>();
}
@Entity
public class ClassWithCompositeKey {
@EmbeddedId
protected CompositeKey compositeKey;
@JoinColumn(name = "A_ID", insertable = false, updatable = false)
@ManyToOne(optional = false)
private A a;
@JoinColumn(name = "B_ID", insertable = false, updatable = false)
@ManyToOne(optional = false)
private B b;
@JoinColumn(name = "C_ID", insertable = false, updatable = false)
@ManyToOne(optional = false)
private C c;
public ClassWithCompositeKey(A a, B b, C c) {
this.a = a;
this.b = b;
this.c = c;
this.compositeKey = new CompositeKey(a.getId(),b.getId(),c.getId());
}
}
@Embeddable
public class CompositeKey {
@Basic(optional = false)
@Column(name = "A_ID", columnDefinition = "raw")
private String aId;
@Basic(optional = false)
@Column(name = "B_ID", columnDefinition = "raw")
private String bId;
@Basic(optional = false)
@Column(name = "C_ID", columnDefinition = "raw")
private String cId;
public CompositeKey(String aId, String bId, String cId) {
this.aId = aId;
this.bId = bId;
this.cId = cId;
}
}
次に、保存しようとしているとき:
A a = new A();
B b = new B();
C c = new C();
entityManager.persist(a);
entityManager.persist(b);
//I'm not saving C
ClassWithCompositeKey classWithCompositeKey = new ClassWithCompositeKey(a, b, c);
c.getRelations().add(classWithCompositeKey);
entityManager.persist(c);
例外が発生しています
"ConstraintViolationException: Column 'C_ID' cannot be null"
これは、「c」が保存される前にc.idがnullであるためですが、この値はCompositeKeyインスタンスに渡されます。
「c」を保存し、ClassWithCompositeKeyのコレクションを自動的に保存したいと思います。ただし、最初に「c」を保存してから、ClassWithCompositeKeyインスタンスをアタッチして保存する必要があります。1回の「永続的」呼び出しでCとClassWithCompositeKeyをカスケードで保存することは(おそらく他の種類のマッピングを使用して)可能ですか?