java - 在 jpa 中保存具有一对多关系的实体会出现以下错误
问题描述
服务:
@Transactional
@Override
public ContactDTO save(ContactDTO contactDTO) {
Contact contact = new Contact();
modelMapper.map(contactDTO.getIdentification(), contact);
contact.setAddresses(contactDTO
.getAddressList().stream().map(s ->
{
Address address = new Address();
modelMapper.map(s, address);
return address;
}).collect(Collectors.toList()));
repository.save(contact);
return contactDTO;
}
实体:
@Entity
@Table(name = "contract")
public class Contact {
...
@OneToMany(cascade = CascadeType.ALL, mappedBy = "contact", fetch = FetchType.LAZY)
private List<Address> addresses = new ArrayList<>();
}
@Entity
@Table(name = "address")
public class Address implements Serializable {
....
@ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.PERSIST)
@JoinColumn(name="contact_id", nullable=false)
private Contact contact;
}
错误日志:
2020-09-02 14:09:44.939 ERROR 20148 --- [nio-8080-exec-2] o.h.engine.jdbc.spi.SqlExceptionHelper : NULL not allowed for column "CONTACT_ID"; SQL statement:
insert into address (city, contact_id, number, state, street, type, unit, zipcode, id) values (?, ?, ?, ?, ?, ?, ?, ?, ?) [23502-197]
解决方案
您需要以双向关系同步双方,这意味着您需要设置Contract
每个Address
来更新外键
contact.getAddresses().forEach(a -> a.setContact(contact));
推荐阅读
- notepad++ - 记事本++中包含符号的单词前的新行
- c++ - 编写构造函数/析构函数是一种好习惯吗?
- python-3.x - 如果我在带括号的列表中有重复项,我该怎么办
- adobe-brackets - 括号实时预览突然不工作
- java - 如何在我的 Google Glass 应用中录制视频?
- sql - 尝试连接到 Azure 中的 SQL 服务器时在 signalR ASP.NET 中出错
- r - 如何正确地将拟合的线性模型导出到 rds 文件并稍后重新创建?
- java - 如何使用 FIPS BouncyCastle 将 ECPrivateKey 转换为 ECPublicKey?
- office365 - 如何将电子邮件复制到 Office 365 群组?
- sql - 通过同一张表SQL减去组上的两列