I want a one-way relationship between objects from 3 Java classes: Person to Heart and Person to Liver. I want the objects to have the same PC, that is, each person has a corresponding heart and liver, where person.person_id = heart.heart_id = liver.liver_id. I do not want to combine 3 tables into 1, because each has many fields. Here is my code (mainly based on the accepted answer to this question ):
@Entity
public class Person {
public long personId;
private String name;
public Heart heart;
public Liver liver;
@Id
@GeneratedValue
public long getPersonId() {return personId;}
@OneToOne(cascade = CascadeType.ALL)
@PrimaryKeyJoinColumn
public Heart getHeart() {return heart;}
@OneToOne(cascade = CascadeType.ALL)
@PrimaryKeyJoinColumn
public Liver getLiver() {return liver;}
}
@Entity
public class Heart {
private long heartId;
private int bpm;
private Person person;
@Id
@GenericGenerator(
name = "generator",
strategy = "foreign",
parameters = @Parameter(name = "property", value = "person")
)
@GeneratedValue(generator = "generator")
public long getHeartId() {return heardId;}
@OneToOne(mappedBy="heart")
@PrimaryKeyJoinColumn
public Person getPerson() {return person;}
}
@Entity
public class Liver {
private long liverId;
private boolean healthy;
private Person person;
}
I am setting up a session and doing the following:
Person jack = new Person();
jack.setName("jack");
Heart heart = new Heart();
heart.setBpm(80);
Liver liver = new Liver();
liver.setHealthy(true);
Then, if I bind a person’s object to it with organs and save it, I get an error message (NOTE: I have the same behavior when I just used 2 classes, for example Person and Heart):
jack.setHeart(heart);
jack.setLiver(liver);
session.save(jack);
org.hibernate.id.IdentifierGenerationException: id null one-to-one: person
, :
jack.setHeart(heart);
heart.setPerson(jack);
jack.setLiver(liver);
liver.setPerson(jack);
session.save(jack);
, , ?
. , , ( ), 2 , . Person and Heart, :
heart.setPerson(jack);
session.save(heart);
, ( , Person , PK, , , ), , 3- ...