我正在尝试实现将父对象及其子对象持久化。子对象具有一个复合键,其中包含指向父对象的外键。
当前映射是单向一对多的,父级拥有该关系。
这是我的模特:
父母:
@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的问题,我认为这只是希望,而且我对孩子有约束违规。我正在寻找有关如何实现构建包含其子对象的父对象并将其一次性保存的想法。
感谢您的帮助,
答案 0 :(得分:1)
我问了一个非常相似的问题here。看看问题和答案(有效)。
本质上,您可以尝试以下方法:
@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。请注意,在父级方面,我们使用mappedBy
后跟Java属性的名称,而不是@JoinColumn
,因为父级不能成为关联的所有者(另请参见this question)。另外,使用addChild
方法在关系的两侧正确设置属性也很有用。
成功!