【发布时间】: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,该字段不可为空
-
我写了一个答案,但我会逐步完成。因此,请应用我在回答中建议您的更改,并在评论中让我知道它是如何工作的。没事吧?
-
我可以试试看是的。