【问题标题】:Unidirectional OneToMany with composite children key, not propagating parent id具有复合子键的单向 OneToMany,不传播父 ID
【发布时间】:2017-11-07 15:17:04
【问题描述】:

我有以下 2 个实体:

@Entity
@Table(name = "PARENT")
public class ParentEntity{
    @Id
    @Column(name = "PARENT_ID")
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "dtvSeq")
    @SequenceGenerator(name = "dtvSeq", sequenceName = "PARENT_ID_SEQ")
    private Long parentId;

    @OneToMany(mappedBy = "childEntityPk.parentId", fetch = FetchType.EAGER, cascade = CascadeType.ALL)
    Collection<ChildEntity> childrenEntities;

    //getters and setters ommited

}

以及子实体,具有组合主键,部分引用 Parent_id (fk):

@Entity
@Table(name = "CHILDREN")
public class ChildEntity {
    @EmbeddedId
    private ChildEntityPk childEntityPk;

    //other fields
    //getter and setters ommited

    @Embeddable
    private class ChildEntityPk implements Serializable{
        long parentId;
        String name;
    }
}

它可以完美地获取数据。但是,如果我想一次性持久化 ParentEntity 及其子实体,我会从 Oracle 得到一个例外。

这个异常被抛出是因为hibernate没有更新childEntity.childEntityPk.parentId并且试图插入null。

我也玩过@JoinColumn,但没有成功。

我不想进行双向映射。

【问题讨论】:

  • 你不需要再去@EmbeddedId了。您可以简单地使用 @Id 注释几个字段,这具有相同的效果,但会删除诸如 childEntityPk.parentId 之类的内容。我看到的解决方案要么是您不想要的双向映射,要么是在插入之前使用父 ID 填充子实体
  • 有什么异常?
  • 只是一个oracle异常,因为hibernate试图在children表的parent_id字段中插入null,该字段不可为空
  • 我写了一个答案,但我会逐步完成。因此,请应用我在回答中建议您的更改,并在评论中让我知道它是如何工作的。没事吧?
  • 我可以试试看是的。

标签: java hibernate


【解决方案1】:

你有 addChild() 方法还是只是更新集合?我建议

public void addChild(ChildEntity child) {
     child.setChildEntityPk(this.parentId, "name");
     childrenEntities.add(child);
}

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-09-08
  • 1970-01-01
  • 2021-10-07
  • 2015-07-11
  • 2021-06-01
  • 2021-11-09
  • 1970-01-01
相关资源
最近更新 更多