Hibernate注释@OnetoOne似乎不会限制数据库中的多个条目

时间:2014-04-13 12:11:17

标签: java hibernate postgresql

以下是两个定义为彼此具有一对一关系的类。所以基本上维护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();
}

}

1 个答案:

答案 0 :(得分:1)

Hibernate不会检查另一个人是否已经指向同一个人的详细信息。即使它确实如此,情况也可能在之后发生变化(因为事务同时执行),因此这种检查不会有效。这就是为什么这个检查必须由数据库本身完成,使用Person.personDetailsFK列上的唯一约束。

AFAIK,如果您要求它为您生成数据库架构,Hibernate会生成这样一个唯一约束。如果不这样做,请确保创建这样的约束。