2012-10-16 14 views
12

Nel mio esempio, Employee ha una relazione OneToOne con Department con CascadeType.PERSIST. Quando io insisto multipla Employee,Come funziona JPA CascadeType.PERSIST?


Perché il EntityManager persistono un singolo Department record per tutti Employee record?


La mia aspettativa è, se usiamo CascadeType.PERSIST, quando un Employee si sta persisteva, un record Department verrà creato di nuovo per ogni Employee record.

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(); 
} 

Risultato:

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

Mi aspetterei che DEP_ID avrebbe vincolo unico per l'annotazione OnetoOne (Proprio come il Many-lato di un tavolo JOIN per un'associazione OneToMany ha un vincolo UNIQUE su di essa). Qualcuno può spiegare perché in questo caso DEP_ID non ha un vincolo UNIQUE, nonostante l'annotazione OneToOne? – Chris

risposta

11

JPA mantiene l'identità dell'oggetto e non mantiene un oggetto esistente.

cambiamento che il codice sia corretta,

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

sì, lo so, la tua codifica funzionerà. Si crea una nuova istanza di 'Dipartimento' per tutti gli' Impiegati'. Cosa c'era di sbagliato nella mia comprensione? – CycDemo

+0

Perché si ha una mappatura da dipendente a reparto, non da uno a uno. – Erfankam

+8

Sarebbe interessante anche ottenere una risposta alla domanda "Come funziona JPA CascadeType.PERSIST?". Poiché questo è il motivo per cui ho guardato la domanda. –