2012-11-09 3 views
3

으로 목록에 새 항목을 추가하려면 어떻게 난 2 개 테이블. 하나는 직원이라고하고 다른 하나는 전화라고하며 직원은 여러 개의 전화를 가질 수 있습니다.JPA는 : 나는 OneToMany 주석

직원 클래스 :

@Entity 
@Table(name = "employee") 
public class Employee { 

    @Id 
    @Column(name = "id", unique = true, nullable = false) 
    @GeneratedValue(strategy = javax.persistence.GenerationType.IDENTITY) 
    private Integer id; 

    @Column(name = "name", unique = true, nullable = false, length = 25) 
    private String name; 

    @OneToMany(mappedBy="owner", fetch= FetchType.EAGER, orphanRemoval=true, cascade={CascadeType.ALL}) 
    private List<Phone> phones; 

전화 클래스 :

@Entity 
@Table(name = "phone") 
public class Phone { 

    @Id 
    @Column(name = "id", unique = true, nullable = false) 
    @GeneratedValue(strategy = javax.persistence.GenerationType.IDENTITY) 
    private long id; 

    @ManyToOne(fetch = FetchType.EAGER) 
    @JoinColumn(name = "employee_id") 
    private Employee owner; 

    @Column(name = "phone_type", nullable = false, length = 25) 
    private String phoneType; 

    @Column(name = "phone_number", nullable = false, length = 25) 
    private String phoneNumber; 

은 가정하자 내가 기존 직원에게 전화를 추가 할. 나는이 일을하고있다 :

Phone phone = new Phone(); 
phone.setOwner(employee); 
phone.setPhoneNumber("999-555-0001"); 
phone.setPhoneType("home"); 
employee.getPhones().add(phone);   
dao.merge(employee); // Is it possible to get this to both persist new phones and update existing phones that were changed? 

나는 phoneSet의 전화 중 일부는 이미 지속 된 점을 감안 새로운 휴대폰을 병합하는 방법을 모르겠어요. 각 전화를 수동으로 유지해야합니까? 예를 들어 주시면 감사하겠습니다. 계단식으로 들여다 보았지만 제대로 작동하지 않는 것 같습니다. 받은 오류 : java.lang.IllegalStateException : 엔터티 복사본이 이미 다른 엔터티에 할당되었습니다.

+0

오류가 있습니까? 게시 할 수 있습니까? 또한 필자는 필요한 각 필드에 대한 getter 및 setter 메서드를 생략했다고 가정합니다. 당신이 어떤 @Transactional이 곳이 있습니까 계단식에 대한 –

+0

은 @OneToMany 주석 – willome

+0

에 [캐스케이드 = CascadeType.ALL, orphanRemoval = TRUE]을 추가? – willome

답변

1

나는 문제가 전화 클래스에 참여 열 주석에있을 수 있습니다 생각합니다. 당신은이 id 필드의 @Column 주석이 열 id에 매핑 된 Employee 클래스에 아직 employee_id의 열을 조인 지정된다.

한번에 변경/동기화 조인 열 :

@ManyToOne(fetch = FetchType.EAGER, targetEntity=your.package.here.Employee.class) 
@JoinColumn(name = "id") 
private Employee owner; 

또는

Employee.java

@Id 
@Column(name = "employee_id", unique = true, nullable = false) 
@GeneratedValue(strategy = javax.persistence.GenerationType.IDENTITY) 
private Integer id; 

Phone.java

@ManyToOne(fetch = FetchType.EAGER) 
@JoinColumn(name = "employee_id", targetEntity=your.package.here.Employee.class) 
private Employee owner; 
+0

의 이름은에 열을 가입 전화 테이블은 Employee 테이블의 기본 키 열 이름과 일치 할 필요가 없습니다. 실제로 원래의 매핑이 정확한 것 같습니다. 목록이 지정되지 않은 (안 사용하여 제네릭) 인 경우에 게다가, targetEntity은 직원 엔티티 필요하다, 단지 관계 주석 (@OneToMany, @ManyToMany 등)에 지정되어 있습니다. – German