首页 > 解决方案 > 在 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]

标签: javaspring-bootjpa

解决方案


您需要以双向关系同步双方,这意味着您需要设置Contract每个Address来更新外键

contact.getAddresses().forEach(a -> a.setContact(contact));

推荐阅读