JPA 未将外键保存到@OneToMany关系

2022-09-02 00:52:03

我正在使用Spring和Hibernate作为JPA提供商,并试图获得一个@OneToMany(具有许多电话号码的联系人)以将外键保存在电话号码表中。从我的表单中,我得到一个联系人对象,其中包含电话(号码)列表。联系人正确持久化(休眠从指定的序列中提取 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;
    }
}

希望我得到了上面的所有相关位,否则请让我知道。


答案 1

您必须自己管理 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;

  ...
}

答案 2

在回答克莱图斯的回答时。我想说的是,在id字段以及所有序列上都有注释很重要。使用批注的 mappedBy 参数的替代方法是使用批注。@column@OneToMany@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);
    }
}

推荐