我正在使用Spring和Hibernate作为JPA提供程序,并且正在尝试获取@OneToMany(具有许多phonenumbers的联系人)以将外键保存在电话号码表中.从我的表单中我得到一个Contact对象,其中包含Phone(数字)列表.Contact正确持久化(Hibernate从指定的序列中获取PK).电话(号码)列表也会以正确的PK保留,但是联系人表格中没有FK.
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;
    }
}
希望我得到上面的所有相关内容,否则请告诉我.
cle*_*tus 27
您必须自己管理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 Phone {
  @Id
  private Long id;
  @ManyToOne
  private Contact contact;
  ...
}
回答Cletus的回答.我会说,@column在id字段以及所有序列内容上都有注释很重要.使用@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);
    }
}
小智 5
如果 Contact-Phone 关系是单向的,您也可以mappedBy在@OneToMany注释中替换  为@JoinColumn(name = "contact_id")。
@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)
| 归档时间: | 
 | 
| 查看次数: | 39053 次 | 
| 最近记录: |