Я хочу однонаправленный Индивидуальные отношения между объектами из 3 классов java: от человека к сердцу и лица к печени. Я хочу, чтобы объекты имели один и тот же ПК, то есть каждый человек имеет соответствующее сердце и печень, где person.person_id = heart.heart_id = liver.liver_id. Я не хочу объединять 3 таблицы в 1, потому что у каждого есть множество полей. Вот мой код (в основном на основе принятого ответа на this question):Hibernate взаимно-однозначная ассоциация с общим PK между 3 классами
@Entity
public class Person {
public long personId;
private String name;
public Heart heart;
public Liver liver;
// other fields
@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;}
// other getters and setters and constructors
}
@Entity
public class Heart {
private long heartId;
private int bpm;
private Person person;
// other fields
@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;}
// other getters and setters and constructors
}
@Entity
public class Liver {
private long liverId;
private boolean healthy;
private Person person;
// other fields
// the rest uses the same hibernate annotation as Heart
}
I Настройка сеанса и выполните следующие действия:
Person jack = new Person();
jack.setName("jack");
Heart heart = new Heart();
heart.setBpm(80);
Liver liver = new Liver();
liver.setHealthy(true);
Тогда, если я связываю объект человека с его органами, и сохранить его, я получаю сообщение об ошибке (Примечание: я получил такое же поведение, когда я только что использовали 2 классов, например, Человек и сердце):
jack.setHeart(heart);
jack.setLiver(liver);
session.save(jack);
орг. hibernate.id.IdentifierGenerationException: попытка присвоить идентификатор из нулевой собственности один-к-одному: человек
Однако это работает, если я установить взаимосвязи в обоих направлениях:
jack.setHeart(heart);
heart.setPerson(jack);
jack.setLiver(liver);
liver.setPerson(jack);
session.save(jack);
Но, конечно, это не должно быть необходимо для однонаправленных отношений?
Cheers
ps. Как ни странно, я замечаю, что он работает (сохраняет оба объекта в БД), когда я просто использую 2 класса, например. Человек и сердце, и я просто установить связь по-другому:
heart.setPerson(jack);
session.save(heart);
Я понятия не имею, почему это работает (кажется логичным, что лицо является родительским объектом, так как он автоматически генерирует свой собственный ПК, и другие используют это, так что это все, что вам нужно настроить), но в любом случае я не могу понять, как применить этот рабочий метод к моей ситуации в 3 классах ...
Я только что нашел этот вопрос, который я думаю о той же ситуации, но использует совершенно иной подход (он использует @Embeddable и @Inheritance): http://stackoverflow.com/questions/ 904634. Единственная проблема заключается в том, что в принятом решении недостаточно кода, чтобы понять/реализовать его ... может ли кто-нибудь помочь? – jackocnr