How to define @OneToMany in parent entity when child has composite PK?

六眼飞鱼酱① 提交于 2020-01-10 05:44:06

问题


My Parent class has two child classes: Child and ParentHobby. The Child class has a singular PK and the @OneToMany mapping on it works. The problem is that I don't know how to map it on the ParentHobby class, which has a composite PK.

Parent:

//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;

Child:

@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;

ParentHobby:

@Entity @Table(name="PARENT_HOBBY") public class 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;

The exception I get at compile time is:

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

How can I define a @OneToMany relationship in a parent entity when the child has a composite primary key?

SIMILAR:

@OneToMany relationship with Composite key

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

JPA composite key @OneToMany


回答1:


You need to use a derived identity.

ParentHobbyPK should look like this:

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

ParentHobby should look like this (the important thing being the @MapsId annotation):

@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;

    ...
}

Derived identity is discussed in JPA 2.1 spec, section 2.4.1.



来源:https://stackoverflow.com/questions/31600142/how-to-define-onetomany-in-parent-entity-when-child-has-composite-pk

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!