I have defined the following entities:
@Entity
public class Child implements Serializable
{
@Id
@ManyToOne(cascade = CascadeType.ALL)
public Parent parent;
@Id
public int id;
}
@Entity
public class Parent
{
@Id
public int id;
}
When I try to persist a Child with the following code:
Parent p = new Parent();
p.id = 1;
Child c1 = new Child();
c1.id = 1;
c1.parent = p;
em.persist(c1);
Hibernate throws a 'Referential integrity constraint violation' error:
Caused by: org.h2.jdbc.JdbcSQLException: Referential integrity constraint violation: "FK3E104FC802AAC0A: PUBLIC.CHILD FOREIGN KEY(PARENT_ID) REFERENCES PUBLIC.PARENT(ID) (1)"; SQL statement:
insert into Child (parent_id, id) values (?, ?) [23506-171]
I believe this is because it first inserts the Child and then the Parent, while I would expect it to insert the Parent first. Any idea how I can change the order of insertion, or how to to solve this in some other way?
Update: note that this approach is not JPA compliant, but uses Hibernate specifics (see section 5.1.2.1. Composite identifier in the hibernate docs)
Update: I would like to only have to persist the Child c1 and have the persist cascade to Parent p automatically (this update is in reaction to @Alf's answer below).