私は、双方向のOneToOne
関係と少し混乱しています。これは、両端でオプションではない可能性があります。私はHibernateでJPA2を使用しています:
@Entity
@Table(name = "city")
public class City {
@Id
@GeneratedValue
@Column
public Long _UID;
@OneToOne(mappedBy="city", optional=false, orphanRemoval = true, cascade=CascadeType.ALL)
public Mayor mayor;
}
@Entity
@Table(name = "mayor")
public class Mayor {
@Id
@GeneratedValue
@Column
public Long _UID;
@OneToOne(optional=false, cascade=CascadeType.ALL)
public City city;
}
そして、このトランザクションを試してみると:
Mayor m = new Mayor("Ed", "Lee");
City c = new City("San Francisco", 100000);
m.setCity(c);
c.setMayor(m);
EntityTransaction et = this.getEm().get().getTransaction();
et.begin();
this.getEm().get().persist(c);
this.getEm().get().flush();
et.commit();
次の例外が発生します。
javax.persistence.PersistenceException: org.hibernate.PropertyValueException: not-null property references a null or transient value: test.persistence.entity.Mayor.city
City
永続化する前にインスタンスを検査するMayor
と、適切な場所にインスタンスがあり、このMayor
インスタンスにはインスタンスに戻る関係が設定されていCity
ます。
シティ側だけでoptional=false
大丈夫です。