一対一の関係をシミュレートしようとしています。結合列属性に nullable = false を追加しようとすると
、アドレスの ID が null であることを示す SQLIntegrityContraintViolationException が発生します。IDで使用している自動生成値はコミット時に生成されるため、これを期待しています。(私は正しいですか?)...
しかし、アドレス コンストラクターに変更を加えると、そこに ID を設定して永続化しようとします。同じ例外が発生します。私はなぜなのか理解していない。
ただし、nullable = false を削除すると、正常に実行できます。どこが間違っているのか説明してください。
これが私の実装です.GetterとSetterは、簡単にするために省略されています。
@Entity
public class CustomerEX implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
private String name;
@OneToOne(fetch = FetchType.LAZY,cascade = CascadeType.PERSIST)
@JoinColumn(name="address_fk")
private AddressEx address;
public void setAddress(AddressEx address) {
this.address = address;
this.address.setCustomer(this);
}
---
----
}
and
@Entity
public class AddressEx implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue
private Long id;
private String city;
private String country;
@OneToOne
private CustomerEX customer;
}
私の主な機能は次のようなものです...
public class CustomerTest {
public static void main(String[] args) {
AddressEx addr = new AddressEx();
addr.setCity("Bangalore");
addr.setCountry("India");
System.out.println(addr.getId()+ " is the id of this object");
CustomerEX cust = new CustomerEX();
cust.setName("ravi");
cust.setAddress(addr);
EntityManagerFactory emf = Persistence.createEntityManagerFactory("PersistenceAppPU");
EntityManager em = emf.createEntityManager();
EntityTransaction etx = em.getTransaction();
etx.begin();
em.persist(cust);
etx.commit();
}
}
どこが間違っていますか?