我只想回答第三个问题,因为它没有完全被解释清楚。
以下是你的问题:
为什么丈夫成员单独拥有 @OnetoOne(mappedBy="Wife"),而妻子成员没有 @OnetoOne(mappedBy="husband")
首先,这里有一些错误:应该是:@OneToOne(mappedBy="wife")
,而不是 Wife
。请注意,mappedBy
应该跟随 Husband
类的属性 wife
,而不是 类 Wife
,也不是 Husband
类名,尽管 Husband
类是所有者。在 Hibernate文档 中说:
mappedBy 指的是所有者端关联属性的名称。
第二点需要注意的是,当我们进行数据库映射时,有两种关系:单向和双向。我们使用单向关系只有在我们只想让一个部分处理/维护这个关系,并且从另一侧来说,我们不感兴趣获取这一侧的数据。在您的示例中,如果我们只想从
Husband
到
Wife
类建立单向关系,我们只想知道通过具有
Husband
类型对象,他的妻子是谁(通过其
getWife()
方法),但我们对了解一个女士的丈夫不感兴趣。
在这种情况下,我们可以编写以下代码:
(请注意,在
Husband
类中,我们具有
Wife
类型的属性,但在
Wife
类中,我们
没有Husband
类型的属性)
Husband.java:
@Entity
public class Husband implements Serializable {
...
@OneToOne
@JoinColumn(name="idWife")
private Wife wife;
}
Wife.java:
@Entity
public class Wife implements Serializable {
@Id
private int id;
private String name;
}
但是,如果我们想要建立双向关系,我们必须在两个方向上进行映射,并且在拥有方的属性之前需要使用mappedBy
。
我们保持Husband
端不变,然后更改Wife.java
:
Wife.java:
@Entity
public class Wife implements Serializable {
@Id
private int id;
private String name;
@OneToOne(fetch=FetchType.LAZY, mappedBy="wife")
private Husband husband;
}
请查看此页面:https://en.wikibooks.org/wiki/Java_Persistence/OneToOne,它以易懂的方式解释了所有内容。
第三点,只需注意一下:拥有方通常是具有另一个表的外键的表的类。或者,我们只需记住:拥有者拥有所有权,因此它在其表中也具有FK。