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

问题描述 投票:1回答:1

我正在学习Hibernate并遇到了Owning-sideNon-owing side这两个术语。

阅读后,我才知道Owning-side是指有FK引用另一个实体的实体。

Consider the below scenario:

User entity:

@Entity
public class User {
    @Id
    private int userId;
    private String userName;

    @OneToOne
    @JoinColumn("VEHICLE_ID")
    private Vehicle vehicle;
    // other code
 }

Vehicle Entity:

@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实体。

谁能帮我理解?

java hibernate jpa orm one-to-one
1个回答
1
投票

如果我将@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参考文档还为不同的关联类型提供了一个很好的简要描述:OneToOneOneTomanyManyToMany

© www.soinside.com 2019 - 2024. All rights reserved.