0

一対一の関係をシミュレートしようとしています。結合列属性に 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();
    }
}

どこが間違っていますか?

4

1 に答える 1

0

持続アクションを顧客からアドレスにカスケードする必要があります。顧客を保存していますが、アドレスは生成されているため、まだ ID を持っていません

于 2012-08-06T23:54:06.083 に答える