2012-10-16 18 views
12

Örneğimde, Employee, ile CascadeType.PERSIST numaralı Department ilişkisine sahiptir. Birden Employee, devam ediyorsa JPA CascadeType.PERSIST nasıl çalışır?


Neden EntityManager tüm Employee kayıtları için tek Department kayıt devam eder? Biz CascadeType.PERSIST, bir Employee kalıcıdır edilirken, bir Department rekor her Employee kayıt için yeniden oluşturulacak kullanırsanız


Beklentim vardır.

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

Sonuç:

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

UNIQUE kısıtı vardır üstünde). OneToOne ek açıklamalarına rağmen DEP_ID'nin bu durumda neden bir UNIQUE kısıtlaması olmadığını açıklayan herhangi biri var mı? – Chris

cevap

11

JPA nesne kimliğini korur ve varolan bir nesneyi sürdürmez.

değiştirme kod, doğru olduğu

for(int i=1; i <= 10; i++) { 
    Department department = new Department("Test Department"); 
    Employee e = new Employee("EMP" + i, department); 
    em.persist(e); 
} 
Ben DEP_ID çünkü sadece OneToMany dernek için JOIN tablonun Birçok tarafı gibi OneToOne açıklama (bir UNIQUE sınırlamasına sahip olacağını beklenebilir
+1

Evet, biliyorum, kodlamanız çalışacaktır. Tüm “Çalışan” için “Departman” ın yeni örneğini yaratırsınız. Benim neyim yanlıştı? – CycDemo

+0

Çalışan bir bölümünden bire bir eşleştirmeye sahip olduğunuz için, bire bir değil. – Erfankam

+8

"JPA CascadeType.PERSIST nasıl çalışır?" Sorusuna da bir cevap almak ilginç olurdu. Bu soruna bakmamın nedeni bu. –