2013-06-16 4 views
3

난 그냥 내 문제에 대한 모든 솔루션 (정전 어쩌면 어떤 종류의)JPA - OneToMany-관계에있는 개체를 업데이트

은 다음과 내가 가지고 말할 수 있습니다를 찾을 수 없기 때문에 그럼 난 조금 혼란 스러워요 (간체) 엔티티 :

@Entity 
public class Employee { 
    @Id 
    private long id; 
    @OneToMany(mappedBy="owner") 
    private Collection<Phone> phones; 
} 

@Entity 
public class Phone { 
    @Id 
    private long id; 
    @ManyToOne 
    private Employee owner; 
} 

내가 JPA에 의해 관리되는 전화 목적이있다. 그리고 지금은 그런 일에 그 전화 개체의 직원을 변경하려면 :

phone.setEmployee(otherEmployee); 

나는 JPA는 해당 직원이 너무 업데이트 될 업데이트 것이라고 생각했다. 내가 잘못? @ManyToOne 및 @OneToMany (cascade = CascadeType.ALL, orphanRemoval = true) 주석을 실험했지만 작동하지 않습니다.

Employee 개체를 직접 업데이트해야합니까? 불행히도 튜토리얼이나 다른 예에서이 케이스를 찾지 못했기 때문에 더 많이 말할 수 있기를 바랍니다. 혼란 스럽습니다. 미리 감사드립니다.

편집 그것도 명확하게하기 :

Phone phone = new Phone(); 
Employee employee = new Employee(); 
phone.setEmployee(employee); 
em.persist(employee); 
em.persist(phone); 

employee.getPhones(); //the phone object should be included here. 
+0

제거하지 않으므로 'CascadeType.REMOVE'는 도움이되지 않습니다. 대신에'CascadeType.PERSIST' 또는'CascadeType.ALL'을 시도하십시오. 또한'Employee' 관계를 변경 한 후에'phone' 객체를 저장한다고 가정합니다. – Darwind

+0

그게 맞아요. CascadeType.ALL을 가지고 있었지만 불행히도 그게 해결책이 아닙니다. (지금은 명료하게 편집했습니다). 소유자가있는 ** 전화 번호 **가 DB에 저장되어'em.find (...) '에 의해 읽혔습니다. 이제는 주인을 바꾸고 싶습니다. (물론 해당 Employee 객체도 업데이트해야합니다.) – Cyboot

+0

소유자를 다른 Employee 객체로 변경 한 후에 em.merge (phone)를 호출 했습니까? – Darwind

답변

6

link이 질문에 대한 대답은, 당신이 직접 전을 관계를 관리해야한다. e .:

class Phone { 
... 
    void setEmployee(Employee employee) { 
     owner = employee; 
     employee.addPhone(phone); 
    } 
... 
} 
+1

좋습니다. JPA 자체에서 관리하게 될 것입니다. 감사합니다. – Cyboot

관련 문제