我正在学习Hibernate并遇到了Owning-side
和Non-owing side
这两个术语。
阅读后,我才知道Owning-side
是指有FK
引用另一个实体的实体。
@Entity
public class User {
@Id
private int userId;
private String userName;
@OneToOne
@JoinColumn("VEHICLE_ID")
private Vehicle vehicle;
// other code
}
@Entity
public class Vehicle{
@Id
private int vehicleId;
private String vehicleName;
@OneToOne
@JoinColumn("USER_ID")
private User user;
// other code
}
如果我将@JoinColumn保留在这两个实体中,那么这些实体User
和Vehicle
都会成为owning-side
实体吗?
我无法理解为什么只放置@JoinColumn
注释使实体成为owning-side
实体。
谁能帮我理解?
如果我将@JoinColumn保留在这两个实体中,那么这些实体User和Vehicle都会成为拥有方实体吗?
我们不首先在实体中使用@JoinColumn
,然后声明该特定实体是拥有实体。实际上反过来也是如此。
我们首先决定哪个实体应该拥有实体,哪个应该是非拥有实体。
我们通过查看哪个实体具有外键引用来决定。而这又是一个设计选择。具有外键引用的那个被称为拥有实体。
然后,我们在拥有实体中使用@JoinColumn
annottation来指定外键。
在非拥有方,我们在特定关联类型中使用mappedBy
属性。
在您的示例中,您指定了双向关系。因此,如果我们考虑Vehicle实体将foreignKey作为userId
,那么Vehicle实体将是我们自己的实体,我们用'@JoinColumn'注释这个'userId'。
在非拥有实体即User实体中,我们将使用'mappedBy'属性来引用已使用@JoinColumn
的拥有实体中的字段:
@Entity
public class User {
@Id
private int userId;
private String userName;
@OneToOne(mappedBy="user")
private Vehicle vehicle;
// other code
}
@Entity
public class Vehicle{
@Id
private int vehicleId;
private String vehicleName;
@OneToOne
@JoinColumn("USER_ID")
private User user;
// other code
}
Here是一个详细的文档,可以帮助您作为参考:
JPA API参考文档还为不同的关联类型提供了一个很好的简要描述:OneToOne,OneTomany,ManyToMany