如何在 parent 中创建与复合 id 的双向 one-to-many 关系?

How to create a bidirectional one-to-many relationship with a composite id in the parent?

我如何更新以下 类 才能使 parent 和 child 之间的 one-to-many 关系正常工作?

Parent:

@Entity
public class Parent {

    @Embeddedid
    private ParentId id;

    @OneToMany
    private List<Child> children;

    public Parent() {
    }

    public Parent(final ParentId id) {
        this.id = id;
    }

    @Override
    public String toString() {
        return "Parent [id=" + this.id + ", children=" + this.children + "]";
    }

    // (Getters and setters)
}

Parent编号:

@Embeddable
public class ParentId implements Serializable {

    private Integer key1;

    private Integer key2;

    public ParentId() {
    }

    public ParentId(final Integer key1, final Integer key2) {
        this.key1 = key1;
        this.key2 = key2;
    }

    @Override
    public boolean equals(final Object obj) {
        if (this == obj) {
            return true;
        }
        if (obj == null) {
            return false;
        }
        if (getClass() != obj.getClass()) {
            return false;
        }
        final ParentId other = (ParentId) obj;
        if (this.key1 != other.key1) {
            return false;
        }
        if (this.key2 != other.key2) {
            return false;
        }
        return true;
    }

    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + this.key1;
        result = prime * result + this.key2;
        return result;
    }

    @Override
    public String toString() {
        return "ParentId [key1=" + this.key1 + ", key2=" + this.key2 + "]";
    }

    // (Getters for key1 and key2)
}

Child:

@Entity
public class Child {

    private Integer id;

    @ManyToOne
    private Parent parent;

    public Child() {
    }

    public Child(final Integer id, final Parent parent) {
        this.id = id;
        this.parent = parent;
    }

    @Override
    public String toString() {
        return "Child [id=" + this.id + ", parent.getId()=" + this.parent.getId() + "]";
    }

    // (Getters and setters)
}

因为我们在当前项目中与这个问题进行了一些斗争,所以我将post我们的解决方案作为这个问题的答案。

Parent:

@Entity
public class Parent {

    @Embeddedid
    private ParentId id;

    /*******************************************************/
    /*******************************************************/
    /*******************************************************/
    // @formatter:off
    @OneToMany(
        cascade = { CascadeType.MERGE, CascadeType.PERSIST },
        fetch = FetchType.EAGER
    )
    @JoinColumns(
        {
            @JoinColumn(name = "parent_key1"),
            @JoinColumn(name = "parent_key2")
        }
    )
    // @formatter:on
    /*******************************************************/
    /*******************************************************/
    /*******************************************************/
    private List<Child> children;

    public Parent() {
    }

    public Parent(final ParentId id) {
        this.id = id;
    }

    @Override
    public String toString() {
        return "Parent [id=" + this.id + ", children=" + this.children + "]";
    }

    // (Getters and setters)
}

Child:

@Entity
public class Child {

    private Integer id;

    @ManyToOne
    /*******************************************************************************/
    /*******************************************************************************/
    /*******************************************************************************/
    // @formatter:off
    @JoinColumns(
        {
            @JoinColumn(name = "parent_key1", insertable = false, updatable = false),
            @JoinColumn(name = "parent_key2", insertable = false, updatable = false)
        }
    )
    // @formatter:on
    /*******************************************************************************/
    /*******************************************************************************/
    /*******************************************************************************/
    private Parent parent;

    public Child() {
    }

    public Child(final Integer id, final Parent parent) {
        this.id = id;
        this.parent = parent;
    }

    @Override
    public String toString() {
        return "Child [id=" + this.id + ", parent.getId()=" + this.parent.getId() + "]";
    }

    // (Getters and setters)
}