【问题标题】:How to make a one-to-many bidirectional relation with JPA annotations, where the collection side owns it如何与集合方拥有它的 JPA 注释建立一对多的双向关系
【发布时间】:2015-02-24 15:07:45
【问题描述】:

我从 Hibernate 文档中获得了 XML 映射。我的问题是如何使用 JPA 注释来做到这一点。它是一对多的双向关系,集合方拥有它。谢谢。

<class name="Person">
    <id name="id" column="personId">
        <generator class="native"/>
    </id>
    <set name="addresses" 
        table="PersonAddress">
        <key column="personId"/>
        <many-to-many column="addressId"
            unique="true"
            class="Address"/>
    </set>
</class>

<class name="Address">
    <id name="id" column="addressId">
        <generator class="native"/>
    </id>
    <join table="PersonAddress" 
        inverse="true" 
        optional="true">
        <key column="addressId"/>
        <many-to-one name="person"
            column="personId"
            not-null="true"/>
    </join>
</class>

【问题讨论】:

    标签: java hibernate jpa orm hibernate-mapping


    【解决方案1】:

    对于集合是拥有方的情况,您需要使@ManyToOne 不可插入和不可更新,同时删除@OneToMany 一侧的mappedBy

    @Entity
    @Table(name = "PERSON")
    public class Person {
    
        @Id
        @Column(name = "personId")
        private long id;
    
        @OneToMany
        private Set<Address> addresses;
    }
    
    
    @Entity
    @Table(name = "ADDRESS") 
    public class Address {
    
       @Id
       @Column(name = "addressId")  
       private long id;       
    
       @ManyToOne
       @JoinColumn(name = "personId", insertable = false, updatable = false)
       private Person person;
    }
    

    这个映射应该生成一个链接表,但是如果你想覆盖它,也可以使用@JoinTable 注解:

    @Entity
    @Table(name = "PERSON")
    public class Person {
    
        @Id
        @Column(name = "personId")
        private long id;
    
        @OneToMany
        @JoinTable(name="PersonAddress", 
            joinColumns=@JoinColumn(name="personId"),
            inverseJoinColumns=@JoinColumn(name="addressId")
        )
        private Set<Address> addresses;
    }
    
    
    @Entity
    @Table(name = "ADDRESS") 
    public class Address {
    
       @Id
       @Column(name = "addressId")  
       private long id;       
    
       @ManyToOne
       @JoinTable(name="PersonAddress", 
            joinColumns=@JoinColumn(name="addressId", insertable = false, updatable = false),
            inverseJoinColumns=@JoinColumn(name="personId", insertable = false, updatable = false)
       )
       private Person person;
    }
    

    【讨论】:

    • 这也没有回答我的问题。我想使用连接表。
    • 它应该在后台创建一个连接表。先试试吧。
    • 查看我的更新答案以获取显式 JoinTable 映射的示例。
    • @VladMihalcea:沉迷于阅读您在 Hibernate 上的答案。不想污染线程。尝试使用注释进行复制,但出现异常。因此提出了这个问题stackoverflow.com/questions/41523914/….
    • 嗯,没有指定“mappedBy”。所以它不是双向的
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-01-26
    • 2013-09-15
    • 1970-01-01
    • 2020-11-20
    • 1970-01-01
    • 2017-05-22
    • 1970-01-01
    相关资源
    最近更新 更多