【问题标题】:How to define @OneToMany in parent entity when child has composite PK?当孩子有复合PK时如何在父实体中定义@OneToMany?
【发布时间】:2015-10-14 12:18:52
【问题描述】:

我的 Parent 类有两个子类:ChildParentHobby。 Child 类有一个单一的 PK 并且其上的 @OneToMany 映射有效。问题是我不知道如何将它映射到具有复合 PK 的 ParentHobby 类上。

家长:

//this works
@OneToMany(cascade = CascadeType.ALL, mappedBy = "parent", fetch = FetchType.EAGER)
private List<Child> childList;

//this DOES NOT work
@OneToMany(cascade = CascadeType.ALL, mappedBy = "parent", fetch = FetchType.EAGER)
private List<ParentHobby> hobbyList;

孩子:

@Entity
@Table(name="CHILD")
public class Child {


    @Id
    @SequenceGenerator(name="CHILD_SEQ", sequenceName="CHILD_DB_SEQ", allocationSize = 1)
    @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="CHILD_SEQ")
    @Column(name="CHILD_ID")
    private long childID;

    @JoinColumn(name = "PARENT_ID", referencedColumnName = "PARENT_ID", insertable = true, updatable = true)
    @ManyToOne(optional = true)
    private Parent parent;

家长爱好:

@实体 @Table(name="PARENT_HOBBY") 公共类 ParentHobby {

@EmbeddedId
private ParentHobbyPK id;

ParentHobbyPK:

@Embeddable
public class ParentHobbyPK {

    @JoinColumn(name = "PARENT_ID", referencedColumnName = "PARENT_ID", insertable = true, updatable = true)
    @ManyToOne(optional = true)
    private Parent parent;

    @Column(name="HOBBY_ID")
    private String hobbyID;

我在编译时得到的异常是:

mappedBy reference an unknown target entity property: ParentHobby.parent in Parent.hobbyList

当子实体具有复合主键时,如何在父实体中定义 @OneToMany 关系?

类似:

@OneToMany relationship with Composite key

Hibernate Entity mapping when Foreign key is part of the composite primary key?

JPA composite key @OneToMany

【问题讨论】:

    标签: hibernate jpa composite-key referential-integrity


    【解决方案1】:

    您需要使用派生的身份。

    ParentHobbyPK 应如下所示:

    @Embeddable
    public class ParentHobbyPK {
        @Column(name="HOBBY_ID")
        private String hobbyID;
        private long parentID; // corresponds to the PK type of Parent
    }
    

    ParentHobby 应该是这样的(重要的是@MapsId 注释):

    @Entity
    @Table(name="PARENT_HOBBY")
    public class ParentHobby {
        @EmbeddedId
        private ParentHobbyPK id;
    
        @MapsId("parentID") // maps parentID attribute of the embedded ID
        @ManyToOne(optional = true)
        @JoinColumn(name = "PARENT_ID", referencedColumnName = "PARENT_ID", insertable = true, updatable = true)
        private Parent parent;
    
        ...
    }
    

    派生身份在 JPA 2.1 规范第 2.4.1 节中讨论。

    【讨论】:

    • 终于找到了一个让我明白的答案!我总是犯同样的错误——你必须看看你在@MapsId 中作为参数输入了什么,我总是把父类的 id 属性的名称放在那里,而不是复合键的名称!
    猜你喜欢
    • 2021-11-09
    • 2022-08-13
    • 1970-01-01
    • 2011-02-13
    • 1970-01-01
    • 2022-01-12
    • 1970-01-01
    • 2016-12-06
    • 2018-08-13
    相关资源
    最近更新 更多