2009-05-02 182 views
14

我將Spring與Hibernate用作JPA提供程序,並試圖讓@OneToMany(具有多個電話號碼的聯繫人)將外鍵保存在電話號碼錶中。從我的表單中,我得到一個Contact對象,其中包含一個Phone(數字)列表。聯繫人得到持久保存(Hibernate從指定的序列中獲取PK)。 Phone(電話號碼)列表也會持有正確的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

由於類似,設置Java關係解決它。 – 2009-05-02 13:15:49

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);

-1

如果聯繫人電話關係是單向的,則還可以使用@JoinColumn(name = "contact_id")替換@OneToMany註釋中的mappedBy

@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; 

    ... 
} 

JPA @OneToMany -> Parent - Child Reference (Foreign Key)