2009-05-02 3 views
14

JPA 프로 바이더로서 Spring을 사용하며 JPA 제공자로 @OneToMany (전화 번호가 많은 연락처)를 가져 와서 전화 번호 테이블에 외래 키를 저장하려고합니다. 내 양식에서 전화 번호 (전화 번호) 목록이있는 연락처 개체를 얻을. Contact는 적절하게 지속된다 (Hibernate는 지정된 시퀀스로부터 PK를 가져온다). 전화 (숫자) 목록도 정확한 PK로 유지되지만 연락처 테이블에는 FK가 없습니다.JPA는 @OneToMany 관계에 외래 키를 저장하지 않습니다.

public class Contact implements Serializable { 
@OneToMany(mappedBy = "contactId", cascade = CascadeType.ALL, fetch=FetchType.EAGER) 
private List<Phone> phoneList; 
} 

public class Phone implements Serializable { 
@JoinColumn(name = "contact_id", referencedColumnName = "contact_id") 
@ManyToOne 
private Contact contactId; 
} 

@Repository("contactDao") 
@Transactional(readOnly = true) 
public class ContactDaoImpl implements ContactDao { 
    @Transactional(readOnly = false, propagation = Propagation.REQUIRES_NEW) 
    public void save(Contact c) { 
    em.persist(c); 
    em.flush(); 
    } 
} 


@Controller 
public class ContactController { 
    @RequestMapping(value = "/contact/new", method = RequestMethod.POST) 
    public ModelAndView newContact(Contact c) { 
    ModelAndView mv = new ModelAndView("contactForm"); 
    contactDao.save(c); 
    mv.addObject("contact", c); 
    return mv; 
    } 
} 

다행히도 위의 관련 비트를 모두 얻었 으면 좋겠다.

답변

21

직접 Java 관계를 관리해야합니다. 이런 종류의 경우 다음과 같은 것이 필요합니다.

@Entity 
public class Contact { 
    @Id 
    private Long id; 

    @OneToMany(cascade = CascadeType.PERSIST, mappedBy = "contact") 
    private List<Phone> phoneNumbers; 

    public void addPhone(PhoneNumber phone) { 
    if (phone != null) { 
     if (phoneNumbers == null) { 
      phoneNumbers = new ArrayList<Phone>();   
     } 
     phoneNumbers.add(phone); 
     phone.setContact(this); 
    } 
    } 

    ... 
} 

@Entity 
public class PhoneNumber { 
    @Id 
    private Long id; 

    @ManyToOne 
    private Contact contact; 

    ... 
} 
+0

감사 비슷한

@Entity public class Contact { @Id private Long id; @OneToMany(cascade = CascadeType.PERSIST) @JoinColumn(name = "contact_id") private List<Phone> phoneNumbers; // normal getter/setter ... } @Entity public class PhoneNumber { @Id private Long id; ... } 

는, 그것을 해결. –

+5

'addPhone' 메소드가 정확합니까? null check가 잘못된 위치에있는 것처럼 보입니다. –

+0

phone.setContact (this) - 메모리 누수가 발생 했습니까? 안 그래? –

6

답장에서 Cletus의 답. id 필드와 모든 시퀀스 작업에 대해 @column 주석을 사용하는 것이 중요하다고 저는 말할 수 있습니다. @OneToMany 주석의 mappedBy 매개 변수를 사용하는 대신 @JoinColumn 주석을 사용하는 것이 좋습니다.

addPhone을 구현하려는 경우를 제외하고는 조금 다릅니다. 그것은 아마 비슷한 것이어야합니다.

public void addPhone(PhoneNumber phone) { 
    if (phone == null) { 
     return; 
    } else { 
     if (phoneNumbers == null) { 
      phoneNumbers = new ArrayList<Phone>(); 
     } 
     phoneNumbers.add(phone); 
     phone.setContact(this); 
    } 
} 
1

addPhone 메서드가 필요하지 않습니다. 전화 개체에서 연락처 만 설정하면됩니다. phone.setContact (contact);

관련 문제