Hibernate:我们可以在两者都拥有的实体之间建立关系吗?

时间:2017-12-24 18:41:32

标签: java hibernate jpa orm one-to-one

我正在学习Hibernate并遇到Owning-sideNon-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保留在这两个实体中,那么这些实体UserVehicle都会成为owning-side个实体吗?

我无法理解为什么只放置@JoinColumn注释使实体成为owning-side实体。

任何人都可以帮助我理解吗?

1 个答案:

答案 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参考文档还为不同的关联类型提供了一个很好的简要说明:OneToOneOneTomanyManyToMany