我创建了一个单向的一对一关系,如下所示:
@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,但它并不是唯一的。为什么呢?
答案 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最后一次做到了。