2010-07-27 5 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 CruiseFacility에 성공적으로 삽입되지만 안에는 CUSTOMER_FK 값이 null입니다. 이는 외래 키 충돌을 지속하지 못하게합니다. 여기서 내가 뭘 잘못 했니?

답변

8

CustomerFacility 사이의 관계는 양방향 연관이므로 이 연결의 양쪽을 관리해야합니다. 이 작업은 수동으로 수행 할 수 있지만 방법으로 수행하는 것이 좋습니다.

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 –

+0

@HarryPham : 천만에요! –

+0

위대한 !! 이것도 내 문제를 해결 ... – venomrld