Hibernate一对一允许多对一

时间:2014-08-31 18:28:48

标签: java hibernate jpa

我创建了一个单向的一对一关系,如下所示:

@Entity(name="person")
public class Person {

    @Id
    @GeneratedValue
    @Column(name = "pid", unique = true) // note 2
    private int id;

    // more fields

    @OneToOne(cascade = CascadeType.ALL)
    @JoinColumn(name="address_id", unique = true) // note 1
    private Address address;

    // rest of class
}

@Entity(name="address")
public class Address {

    @Id
    @GeneratedValue
    @Column(name = "aid", unique = true)
    private int id;

    // rest of class
}

注1:

如果我没有指定" address_id"列像这样唯一

   @JoinColumn(name="address_id")

然后它并不是唯一的,我可以让很多人引用相同的地址,这是一个多对一的关系:

Person person1 = new Person();
Person person2 = new Person();
Address address  = new Address("21th street");
person1.setAddress(address);
person2.setAddress(address);

不应该是一对一的关系来制作外键" address_id"默认是唯一的吗?

注2:

尽管我指定了id,但它并不是唯一的。为什么呢?

2 个答案:

答案 0 :(得分:2)

Hibernate不会强制执行唯一性。这是数据库的工作。

对于OneToOne,请确保address_id列上有唯一约束。对于ID,请确保ID列上存在主键约束(强制唯一性)。

如果使用Hibernate DDL生成生成数据库,Hibernate将使用注释的属性:@Id将创建PK,unique = true将生成唯一约束。

但是对于任何认真的工作,我会使用像FlywayDB或Liquibase这样的工具自己生成模式,它允许将模式从版本迁移到版本。

答案 1 :(得分:0)

根据JPA规范2.10.3.1,默认情况下应该创建一个唯一约束

  

表A包含表B的外键。外键列名   形成如下的串联:名称   关系财产或实体A的领域; " _&#34 ;;的名字   表B中的主键列。外键列具有相同的列   键入表B的主键,并且有一个唯一键   对它的约束。

所以Hibernate似乎违反了规范的那一部分。我似乎记得EclipseLink也做过(或做过)。您应该能够在Stackoverflow中找到关于它的另一个问题。 DataNucleus最后一次做到了。