具有一对一关系的 JPA @JoinColumn 注释
JPA @JoinColumn annotation with One To One relationship
在 JPA 中,@JoinColumn 是否可以用于一对一关系的两端?我的印象是,它应该始终用于一对一关系的拥有方,因为拥有方将具有外键列,并且此注释定义了外键列的属性。如果我的理解不正确,请澄清。
编辑 #1 - 我想知道,在哪种情况下我们将在一对一关系的两端使用 @JoinColumn 注释?
OneToOne 关系不一定是双向的。
当在源对象和目标对象中都存在对关系的另一个对象的引用时,就会发生双向 OneToOne 关系。
在双向一对一关系中,关系的拥有方使用单个外键。另一方面,目标实体必须使用 mappedBy 属性。
- 示例:
让我们考虑 Player 和 Website 对象之间的一对一关系。
每个玩家实体恰好对应一个网站实体:
@Entity
public class Player {
@Id
@Column(name="PLAYER_ID")
private long id;
...
@OneToOne
@JoinColumn(name="WEBSITE_ID")
private Website website;
...
}
如果我们将 mappedBy 选项添加到 Website 实体,OneToOne 单向关联将转换为双向关联:
@Entity
public class Website {
@Id
@Column(name = "WEBSITE_ID")
private long id;
...
@OneToOne(mappedBy="website")
private Player websiteOwner;
...
}
在 JPA 中,@JoinColumn 是否可以用于一对一关系的两端?我的印象是,它应该始终用于一对一关系的拥有方,因为拥有方将具有外键列,并且此注释定义了外键列的属性。如果我的理解不正确,请澄清。
编辑 #1 - 我想知道,在哪种情况下我们将在一对一关系的两端使用 @JoinColumn 注释?
OneToOne 关系不一定是双向的。 当在源对象和目标对象中都存在对关系的另一个对象的引用时,就会发生双向 OneToOne 关系。
在双向一对一关系中,关系的拥有方使用单个外键。另一方面,目标实体必须使用 mappedBy 属性。
- 示例:
让我们考虑 Player 和 Website 对象之间的一对一关系。
每个玩家实体恰好对应一个网站实体:
@Entity
public class Player {
@Id
@Column(name="PLAYER_ID")
private long id;
...
@OneToOne
@JoinColumn(name="WEBSITE_ID")
private Website website;
...
}
如果我们将 mappedBy 选项添加到 Website 实体,OneToOne 单向关联将转换为双向关联:
@Entity
public class Website {
@Id
@Column(name = "WEBSITE_ID")
private long id;
...
@OneToOne(mappedBy="website")
private Player websiteOwner;
...
}