我正在学习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
实体。
任何人都可以帮助我理解吗?
答案 0 :(得分:1)
如果我将@JoinColumn保留在这两个实体中,那么两者都是 这些实体用户和车辆成为拥有方实体?
我们不首先在实体中使用@JoinColumn
,然后声明该特定实体是拥有实体。实际上反过来也是如此
我们首先决定哪个实体应该拥有实体,哪个应该是非拥有实体
我们通过查看哪个实体具有外键引用来决定。而这又是一个设计选择。具有外键引用的那个被称为拥有实体
然后,我们在拥有实体中使用@JoinColumn
annottation来指定外键
在非拥有方,我们在特定关联类型中使用mappedBy
属性。
在您的示例中,您指定了双向关系。因此,如果我们将Vehicle实体的 foreignKey 视为userId
,那么Vehicle实体将是我们自己的实体,我们会注释这个&user;' userId'使用' @ JoinColumn'。
在非拥有实体即用户实体中,我们将使用' 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