2012-10-16 10 views
12

私の例では、Employeeは、DepartmentCascadeType.PERSISTの関係でOneToOneの関係を持っています。私はEmployee複数持続すると は、JPA CascadeType.PERSISTはどのように機能しますか?


はなぜEntityManagerはすべてEmployeeレコードの単一Departmentのレコードを保持しますか?我々はCascadeType.PERSISTEmployeeが永続化されているときに、Departmentレコードは各Employeeレコードに対して新たに作成されますを使用している場合


私の期待は、あります。

Employee.java

@Entity 
public class Employee { 
    private String id; 
    private String name; 
    @OneToOne(cascade = CascadeType.PERSIST) 
    @JoinColumn(name = "DEP_ID", referencedColumnName = "ID") 
    private Department department; 

    ----- 
} 

Department.java

@Entity 
public class Department implements Serializable { 
    private String id; 
    private String name; 
} 

Test.java

public void insert() { 
    em = emf.createEntityManager(); 
    em.getTransaction().begin(); 
    Department department = new Department("Test Department"); 
    for(int i=1; i <= 10; i++) { 
     Employee e = new Employee("EMP" + i, department); 
     em.persist(e); 
    } 
    em.getTransaction().commit(); 
    em.close(); 
} 

結果:

Employee Table   Department Table 
=================  ============================== 
ID Name DEP_ID  ID  NAME  
=================  ============================== 
1 EMP1 1   1  Test Department 
2 EMP2 1 
3 EMP3 1 
4 EMP4 1 
5 EMP5 1 
6 EMP6 1 
7 EMP7 1 
8 EMP8 1 
9 EMP9 1 
10 EMP10 1 
+0

、正しいようにコーディングそれに)。 DEP_IDに、このケースでは、OneToOneアノテーションにもかかわらずUNIQUE制約がない理由を誰でも説明できますか? – Chris

答えて

11

JPAはオブジェクトの同一性を維持し、既存のオブジェクトを永続化しません。

変更私はDEP_IDがOneToManyアソシエーションの結合テーブルの多くの側は、UNIQUE制約を持っていると同じように(なぜならOneToOne注釈のUNIQUE制約を持っているであろうと期待される

for(int i=1; i <= 10; i++) { 
    Department department = new Department("Test Department"); 
    Employee e = new Employee("EMP" + i, department); 
    em.persist(e); 
} 
+1

はい、私は知っている、あなたのコーディングが動作します。すべての 'Employee'に対して' Department'の新しいインスタンスを作成します。私の理解は間違っていたのですか? – CycDemo

+0

従業員から部署への1対1のマッピングがあるため、多対1ではありません。 – Erfankam

+8

「JPA CascadeType.PERSISTはどのように機能しますか?」という質問への回答も興味深いでしょう。これが私の質問を見た理由です。 –

関連する問題