Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Hibernate JoinColumn注释在同一个表上创建列_Hibernate_Jpa_Orm_Hibernate Mapping - Fatal编程技术网

Hibernate JoinColumn注释在同一个表上创建列

Hibernate JoinColumn注释在同一个表上创建列,hibernate,jpa,orm,hibernate-mapping,Hibernate,Jpa,Orm,Hibernate Mapping,我刚进入冬眠状态,正在努力学习。我对@JoinColumn的用法感到困惑。我知道它会创建一个列来关联两个实体。我尝试的是: 有两个阶级的人和房子 个人阶级有一套一对一关系的房子 亲自上课: @OneToMany(cascade = CascadeType.ALL) @JoinColumn(name = "person_id") // this creates a FK on house table with this name private Set<House

我刚进入冬眠状态,正在努力学习。我对@JoinColumn的用法感到困惑。我知道它会创建一个列来关联两个实体。我尝试的是:

  • 有两个阶级的人和房子
  • 个人阶级有一套一对一关系的房子
  • 亲自上课:

        @OneToMany(cascade = CascadeType.ALL)
        @JoinColumn(name = "person_id")  // this creates a FK on house table  with this name
        private Set<House> houses = new HashSet<House>();
    
    这将在
    house
    表上再次创建
    house\u id
    列。但我希望在
    Person
    表上看到这个专栏。为什么会这样

    我想@JoinColumn annotation会在表上创建一个连接列,这就是我们应用此注释的实体。所以在本例中,对于Person类,它在house表上创建Person\u id,对于第二个,我希望在Person类上看到house\u id。但它也会在家里的桌子上创造它。所以我很困惑


    那么它实际上是如何工作的呢?

    @JoinColumn
    在有意义的地方创建一个列

    对于带有
    @JoinColumn
    @OneToMany
    ,连接列需要转到目标实体表,即
    House
    。如果该列是在源实体表中创建的,即
    个人
    ,则一个人只能分配一个房屋,因此它不会是一对多关联


    相反,对于带有
    @JoinColumn
    @ManyToOne
    ,连接列需要转到源实体(即
    House
    )。如果该列转到
    Person
    表,并且您将给定的人分配给一所房子,
    Person.house\u ID
    列将设置为该房子的ID。然后,将无法将另一所房子分配给同一个人(因为
    person.house\u ID
    列已经被“使用”)。这本质上与之前的问题相同,但从协会的“内部”方面来看

    假设house有一个名为person\u id的列,尝试将
    @JoinColumn(name=“house\u id”)
    替换为
    @JoinColumn(name=“person\u id”)

    然后删除
    @JoinColumn(name=“person\u id”)
    并在OneToMany注释中添加属性mappedBy

    @OneToMany(cascade = CascadeType.ALL, mappedBy = "person")
    

    通过这种方式,hibernate将搜索person属性与当前person_id匹配的所有房屋

    您是否尝试指定属性
    mappedBy
    ,例如:
    @OneToMany(mappedBy=“houses”)
    ?是的,我尝试过,这样实际上就不那么混乱了,非常感谢。我搜索了一整天。非常感谢,先生:)
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "person")