This is a shortened version of the entities where I only show the relevant parts.
@Entity @Data public class Wrapper { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Integer id@OneToOne(mappedBy = "wrapper", cascade = CascadeType.ALL, fetch = FetchType.EAGER, orphanRemoval = true) private Application application; public Wrapper(Application application) { this.application = application; application.setWrapper(this); } } @Data @Entity @EqualsAndHashCode(exclude = "wrapper") public class Application { @Id private Integer id; @JsonIgnore @OneToOne @JoinColumn(name = "id") @MapsId private Wrapper wrapper; @OneToMany(mappedBy = "application", cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.EAGER) @SortNatural private SortedSet<Apartement> ownedApartements = new TreeSet<>(); } @Entity @Data public class Apartement { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Integer id; @ManyToOne(fetch = FetchType.LAZY, optional = false) @JoinColumn(name = "application_id", insertable = false, updatable = false) private Application application; }
@Repository
public interface WrapperRepository extends JpaRepository<Wrapper, Integer> {
}
The above entities generates the following create table statements:
create table Wrapper (
id int identity not null,
primary key (id)
)create table Application (
id int not null,
primary key (id)
)create table Apartement ( id int identity not null, application_id int not null, primary key (id) ) alter table Apartement add constraint FKsrweh1i1p29mdjfp03or318od foreign key (application_id) references Application alter table Application add constraint FKgn7j3pircupa2rbqn8yte6kyc foreign key (id) references Wrapper
Given the follow entities and the following code:
Apartement apartement1 = new Apartement()
Apartement apartement2 = new Apartement()Wrapper wrapper = new Wrapper(new Application());
Application application = wrapper.getApplication();
application.getOwnedApartements().addAll(Arrays.asList(apartement1, apartement2));
apartement1.setApplication(application);
apartement2.setApplication(application);WrapperRepository.saveAndFlush(wrapper);
I see three inserts in the log. First wrapper, then application, and finally apartement. But for some reason application_id is null on the first save. But I know it has a bi-directional relationship.
The error I get is:
Caused by: org.h2.jdbc.JdbcSQLException: NULL not allowed for column “APPLICATION_ID”; SQL statement:
insert into Apartement (id) values (null) [23502-197]
Why does this happen? Do I need to store everything in the correct order? Do I need to first store wrapper and application, then finally store the apartement once I have application ID? Cannot hibernate store all three in one go? Or figure this out it self?
#java #spring #hibernate #jpa