为什么存在一对一的非定向映射?

时间:2011-03-13 12:01:09

标签: hibernate hibernate-mapping one-to-one

我正在学习休眠,我对一对一的非定向映射感到困惑。

例如:一个妻子只为一个丈夫,反之亦然。

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;
    }
}

这是一对一的非定向(外键)映射。

现在,我的问题是:

这有用吗?如何确保一个丈夫只能有一个妻子,在这种诉讼中,可能有一个以上的丈夫拥有同一个妻子。

丈夫和妻子之间没有约束。

所以我想知道这是什么问题?

3 个答案:

答案 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,但从应用程序的角度来看,您应该在添加或更新丈夫对象之前强制执行检查。