java - Hibernate:我们可以在双方都是拥有方的实体之间建立关系吗?

标签 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都会成为拥有方实体吗?

我无法理解为什么仅放置@JoinColumn注释就会使实体成为拥有方实体。

谁能帮我理解一下吗?

最佳答案

If I keep the @JoinColumn in both these Entities, then would both these entities User and Vehicle become owning-side entities?

我们不会首先在实体中使用@JoinColumn,然后声明该特定实体是拥有实体。事实上恰恰相反。
我们首先决定哪个实体应该是拥有实体,哪个实体应该是非拥有实体。
我们通过查看哪个实体具有外键引用来决定。这又更多的是一种设计选择。具有外键引用的实体被称为拥有实体
然后,我们在所属实体中使用 @JoinColumn 注解来指定外键。
在非拥有方,我们在特定关联类型内部使用 mappedBy 属性。

在您的示例中,您指定了双向关系。因此,如果我们认为 Vehicle 实体的 foreignKeyuserId,那么 Vehicle 实体将是我们的拥有实体,我们用“@JoinColumn”注释此“userId”。@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

关于java - Hibernate:我们可以在双方都是拥有方的实体之间建立关系吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47963182/

相关文章:

java - Hibernate - 这个映射是否正确?无法通过反射 getter 获取字段值?

java - Struts2、JPA(支持 hibernate )、Spring ... Struts2 和 Spring 日志记录都通过 log4j 但不是 hibernate 工作

java - ClassNotFoundException : org. hibernate.service.jndi.JndiException

java - 溢出如何在java中工作?

java - Java中的char零(0)是什么意思?

java - 如何强制 hibernate 同步序列?

java - Spring MVC + hibernate : How to handle form with relation

java - 有没有像用Kodo在JDO中orphanRemoval这样的方法?

java - Guice:如何为一种类型获取多个@Provides?

java - Selenium Webdriver - 单击多个下拉菜单时出现陈旧元素异常,而 HTML DOM 没有更改