Jose Marlon Ancajas
Jose Marlon Ancajas

Reputation: 51

Saving entity in jpa with one to many relationship get this errors bellow

Service:

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

Entities:

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

Error Logs:

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]

Upvotes: 0

Views: 842

Answers (2)

Eklavya
Eklavya

Reputation: 18410

You need to sync both sides in bi-directional relationship, means you need to set Contract in every Address to update the foreign key

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

Upvotes: 2

Jose Marlon Ancajas
Jose Marlon Ancajas

Reputation: 51

Solved this by changing my code.

From:

@ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.PERSIST)
@JoinColumn(name="contact_id", nullable=false)
private Contact contact; 

To:

@ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.REFRESH)
@JoinColumn(name="contact_id")
private Contact contact; 

removed the nullable=false and change CascadeType.REFRESH

Upvotes: 0

Related Questions