我正在学习休眠,我对一对一的非定向映射感到困惑。
例如:一个妻子只为一个丈夫,反之亦然。
wife.java:
@Entity
public class Wife {
private int id;
private String name;
@Id
@GeneratedValue
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
}
The Husband.java:
@Entity
public class Husband {
private int id;
private String name;
private Wife wife;
@Id
@GeneratedValue
public int getId() {
return id;
}
@OneToOne
@JoinColumn(name="wifeId")
public Wife getWife() {
return wife;
}
}
这是一对一的非定向(外键)映射。
现在,我的问题是:
这有用吗?如何确保一个丈夫只能有一个妻子,在这种诉讼中,可能有一个以上的丈夫拥有同一个妻子。
丈夫和妻子之间没有约束。
所以我想知道这是什么问题?
答案 0 :(得分:3)
当您的关系是可选的(即妻子可以是null
)时,默认情况下,Hibernate不会在外键上创建唯一的约束。但是,您可以使用@JoinColumn(..., unique = true)
创建约束(除非您使用DBMS,其中可空列上的唯一约束不能按预期工作,例如DB2或Ingres)。
对于所需的关系,Hibernate会自动创建唯一约束:
@OneToOne(optional = false)
@JoinColumn(name="wifeId")
public Wife getWife() {
return wife;
}
唯一约束强制执行一对一关系,因为它要求所有丈夫都拥有唯一的wifeId
,因此需要他们引用不同的妻子。
答案 1 :(得分:0)
通过在wifeId列上添加一个唯一约束,您可以确保每个妻子只有一个丈夫。要么将其直接放在数据库中,要么使用hibernate生成架构,请将属性unique="true"
添加到JoinColumn
注释
答案 2 :(得分:0)
映射中的JoinColumn表示Husband表中的列,其中包含妻子表中妻子的标识符。此列存在于Husband表中,因此每个丈夫记录只能在妻子列中保留一个标识符,因此只能有一个妻子。然而,这并没有暗示女人与其他丈夫结婚:D。你必须自己照顾好自己。在我看来,唯一约束不允许Husband表中的两个记录具有相同的wifeId,但从应用程序的角度来看,您应该在添加或更新丈夫对象之前强制执行检查。