2010-07-27 117 views
3

我有問題二實體:JPA:與堅持外鍵約束

客戶實體

@Entity 
public class Customer { 

@Id 
@GeneratedValue(strategy = GenerationType.AUTO) 
private Long id; 

private String name; 

@OneToMany(mappedBy="customer", cascade=CascadeType.ALL) 
private List<Facility> facilities; 

//Setter and Getter for name and facilities 

public void addFacility(Facility facility){ 
    this.facilities.add(facility); 
} 
} 

設施實體

@Entity 
public class Facility { 

@Id 
@GeneratedValue(strategy = GenerationType.AUTO) 
private Long id; 

@ManyToOne 
@JoinColumn(name="CUSTOMER_FK") 
private Customer customer; 

private String name; 

//Setter and Getter, equals and hashcode 
... 
} 

因此,在我主我這樣做

Customer customer = new Customer(); 
    customer.setName("Wake Forest University"); 
    Facility facility = new Facility(); 
    facility.setName("Tom Cruise"); 
    EntityManager entityManager = Persistence.createEntityManagerFactory("EntityClassPU").createEntityManager(); 
    entityManager.getTransaction().begin(); 
    customer.addFacility(facility); 
    entityManager.persist(customer); 
    entityManager.getTransaction().commit(); 

Wake Forest University被成功插入到Customer,Tom Cruise被成功插入Facility,然而在Facility裏,CUSTOMER_FK的值爲空,這表明我失敗了持續的外鍵約束。我在這裏做錯了什麼?

回答

8

您與CustomerFacility之間的關係是雙向關聯,您需要必須管理關聯的兩端。你可以手動做到這一點,但我建議在addFacility()方法中做:

public void addFacility(Facility facility){ 
    if (this.facilities == null) { 
     this.facilities = new ArrayList<Facility>(); 
    } 
    this.facilities.add(facility); 
    facility.setCustomer(this); // that's the part you're currently missing 
} 
+0

你真棒。謝謝你:D – 2010-07-27 23:59:54

+0

@HarryPham:不客氣! – 2010-07-28 01:31:31

+0

太棒了!這也解決了我的問題... – venomrld 2011-11-24 15:28:43