2012-10-16 6 views
12

W moim przykładzie Employee ma związek OneToOne z Department z CascadeType.PERSIST. Kiedy utrzymują stwardnienie Employee,Jak działa WAS CascadeType.PERSIST?


Dlaczego EntityManager utrzymywać pojedynczą Department rekord dla wszystkich Employee zapisów?


Moje oczekiwanie jest, jeśli używamy CascadeType.PERSIST, gdy Employee jest utrzymywały, o Department rekord zostanie utworzony na nowo za każdym Employee rekordu.

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

Wynik:

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

Spodziewam się, że DEP_ID musiałby UNIQUE powodu adnotacji OneToOne (podobnie jak w wielu-stronie tabeli złączenia dla stowarzyszenia OneToMany ma UNIQUE na tym). Czy ktoś może wyjaśnić, dlaczego DEP_ID nie ma w tym przypadku ograniczenia UNIQUE, pomimo adnotacji OneToOne? – Chris

Odpowiedz

11

JPA zachowuje tożsamość obiektu i nie będzie utrzymywał istniejącego obiektu.

Zmień Ci kod będzie poprawny,

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

tak, wiem, twoje kodowanie zadziała. Tworzysz nową instancję 'działu' dla wszystkich' Pracowników'. Co było nie tak z moim zrozumieniem? – CycDemo

+0

Ponieważ masz od jednego do jednego mapowania od pracownika do działu, nie wiele do jednego. – Erfankam

+8

Byłoby interesujące uzyskanie odpowiedzi na pytanie dotyczące "Jak działa JPA CascadeType.PERSIST?". Ponieważ to jest powód, dla którego spojrzałem na to pytanie. –