以下是两个定义为彼此具有一对一关系的类。所以基本上维护Person表以包含PersonDetails表的id作为外键。
根据我的理解,对于表格中每个条目的一对一映射,PersonDetails条目中应该有关联的单个条目,反之亦然,即,对于PersonDetails表中的每个条目,都应该有一个关联的单个条目在人员表中输入。
下面的TestPerson类尝试将PersonDetails表中的单个条目与Person表中的两个或多个条目相关联,令我惊讶的是它成功了。此行为似乎与多对一映射类似。
任何人都可以向我解释为什么会如此?或者如果我遗失了什么?
@Entity
public class Person {
private int personId;
private String personName;
private PersonDetails personDetails;
@Id
@GeneratedValue
public int getPersonId() {
return personId;
}
public void setPersonId(int personId) {
this.personId = personId;
}
public String getPersonName() {
return personName;
}
public void setPersonName(String personName) {
this.personName = personName;
}
@OneToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
@JoinColumn(name="personDetailsFK")
public PersonDetails getPersonDetails() {
return personDetails;
}
public void setPersonDetails(PersonDetails personDetails) {
this.personDetails = personDetails;
}
}
@Entity
public class PersonDetails {
private int personDeatilsId;
private int income;
private String job;
private int zipCode;
@Id
@GeneratedValue
public int getPersonDeatilsId() {
return personDeatilsId;
}
public void setPersonDeatilsId(int personDeatilsId) {
this.personDeatilsId = personDeatilsId;
}
public int getIncome() {
return income;
}
public void setIncome(int income) {
this.income = income;
}
public String getJob() {
return job;
}
public void setJob(String job) {
this.job = job;
}
public int getZipCode() {
return zipCode;
}
public void setZipCode(int zipCode) {
this.zipCode = zipCode;
}
}
public class TestPerson {
public static void main(String[] args) {
AnnotationConfiguration configuration = new AnnotationConfiguration();
configuration.addAnnotatedClass(Person.class);
configuration.addAnnotatedClass(PersonDetails.class);
configuration.configure();
new SchemaExport(configuration).create(true, true);
SessionFactory sessionFactory = configuration.buildSessionFactory();
Session session = sessionFactory.getCurrentSession();
session.beginTransaction();
PersonDetails personDetails = new PersonDetails();
personDetails.setIncome(100000);
personDetails.setJob("Software Engineer");
personDetails.setZipCode(560095);
Person person = new Person();
person.setPersonDetails(personDetails);
person.setPersonName("Jimmi Hendrix");
session.save(person);
Person person2 = new Person();
person2.setPersonDetails(personDetails);
person2.setPersonName("Jimmi Page");
session.save(person2);
session.getTransaction().commit();
sessionFactory.close();
}
}
答案 0 :(得分:1)
Hibernate不会检查另一个人是否已经指向同一个人的详细信息。即使它确实如此,情况也可能在之后发生变化(因为事务同时执行),因此这种检查不会有效。这就是为什么这个检查必须由数据库本身完成,使用Person.personDetailsFK
列上的唯一约束。
AFAIK,如果您要求它为您生成数据库架构,Hibernate会生成这样一个唯一约束。如果不这样做,请确保创建这样的约束。