私は2つのオブジェクトの間に非常に基本的な関係を持っています:
@Entity
public class A {
@ManyToOne(optional = false)
@JoinColumn(name="B_ID", insertable=false, updatable=true)
private StatusOfA sa;
getter+setter
}
@Entity
public class StatusOfA {
@Id
private long id;
@Column
private String status;
getter+setter
}
DB には StatusOfA の限られたセットしかありません。
トランザクションで A を更新します。
@TransactionalAttribute
public void updateStatusOfA(long id) {
A a = aDao.getAById(123);
if(a != null) {
a.getStatusOfA().getId(); //just to ensure that the object is loaded from DB
StatusOfA anotherStatusOfA = statusOfADao.getStatusOfAById(456);
a.setStatusOfA(aontherStatusOfA);
aDao.saveOrPersistA(a);
}
}
saveOrPersistA メソッドはここで「a」をマージしています。
私は、Eclipselink が StatusOfA を更新するために 'a' に対してのみ更新を実行することを期待していますが、StatusOfA テーブルに対して新しい挿入を実行しています。Oracle は、一意の制約違反が原因で不平を言っています (Eclipselink が永続化しようとする StatusOfA は既に存在します...)。ここにはカスケードがないため、問題はなく、Hibernate (JPA2) は例外として動作しています。
同じプロジェクトで、私はすでにいくつかのより複雑な関係を作成しましたが、ここでの関係が機能していないことに本当に驚いています。
よろしくお願いします。