Hibernate一对多级联持久化子项,带有复合键。

3

我希望能够将父对象及其子对象持久化。子对象具有包含对父对象的外键的复合主键。

目前的映射是单向的一对多关系,父对象拥有该关系。

以下是我的模型:

父对象:

@Entity
@Table(name = "PARENT")
public class ParentEntity {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column
    private String name;

    @OneToMany(cascade = CascadeType.ALL)
    @JoinColumn(name = "PARENT_ID")
    private Set<Child> children;

    ...

孩子:

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

    @Id
    @Column(name = "PARENT_ID")
    private Long parentId;

    @Id
    private String source;

    @Id
    private Long alternativeId;

    ...

PK:

class ChildPK implements Serializable {

    private Long parentId;
    private String source;
    private Long alternativeId;

    ...

目前我的问题是Hibernate不能处理在Child中填充parentId,我认为这只是我希望它能够做到的,而且我在child上遇到了约束冲突。我正在寻找如何实现构建包含其子元素的父对象并一次性保存所有内容的方法。

感谢您的帮助,

1个回答

2

我曾经在这里问过一个非常相似的问题(链接)。看一下问题和答案(已经成功实现)。

本质上,你可以尝试这样做:

@Entity
@Table(name = "PARENT")
public class ParentEntity {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column
    private String name;

    @OneToMany(mappedBy="parent", cascade = CascadeType.ALL)
    private Set<Child> children = new HashSet<>();

    public void addChild(Child child){
       child.setParentId(this.id);
       children.add(child);
    }
    ...

并且

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

    @Id
    @Column(name = "PARENT_ID")
    private Long parentId;

    @Id
    private String source;

    @Id
    private Long alternativeId;

    ...

使用相同的 ChildPk。注意,在 Parent 端,我们使用 mappedBy,后面跟着 Java 属性的名称,而不是使用 @JoinColumn,因为父项无法成为关联的所有者(请参阅此问题)。此外,有一个 addChild 方法可以正确地设置关系的双方属性非常有用。
成功!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接