也许存在一个非常明显的答案,但我无法看到它。 我有一个父表Parent和一个子Table Child。
@Entity
@Table(name="PARENT")
public class Parent implements Serializable {
@Id @GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name="PARENT_ID")
private int parentId;
@JsonBackReference
@OneToMany(mappedBy="parent", cascade = CascadeType.ALL)
private List<Child> childs;
....
}
和子实体。
@Entity
@Table(name="CHILD")
public class Child implements Serializable {
@EmbeddedId
private ChildPK id;
@ManyToOne
@JsonManagedReference
@JoinColumn(name="PARENT_ID",insertable = false, updatable = false, referencedColumnName = "PARENT_ID")
private Parent parent;
....
}
复合主键是:
@Embeddable
public class ChildPK implements Serializable {
@Column(name="CTGRY_ID", insertable=false, updatable=false)
private int ctgryId;
@Column(name="PARENT_ID", insertable=false, updatable=false)
private int parentId;
....
}
现在在我的服务方法中,我设置双向关系
childItem.setParent(parent);
parent.setChilds(childItemList);
并在实体上调用save:
parentDao.save(parent);
这将为PARENT表创建一个新条目,其中包含由表标识生成的pk。按照预期使用表标识生成的pk在CHILD表中创建新插入。 但是,子条目的fk应该是parentId,但它是0!
我错过了什么吗? 虽然这个问题不是唯一的,但当我尝试在网上寻找类似的问题时,很少有建议似乎没有相关性。
如果您需要更多详细信息,请与我们联系。 谢谢!
答案 0 :(得分:0)
您正在使两个id的条目都不可插入(一个必须是可插入的,或者JPA实现不知道从哪里获取id):
@ManyToOne
@JsonManagedReference
@JoinColumn(name="PARENT_ID", insertable = false, updatable = false, referencedColumnName = "PARENT_ID")
private Parent parent;
和
@Column(name="PARENT_ID", insertable=false, updatable=false)
private int parentId;
您应该从父对象中删除 insertable = false (第一个示例)。 其他选择是从第二个删除可插入的错误并使其#34;手动&#34;在@prepersist:
@PrePersist
protected setIdsBeforeSave() {
this.id = new ChildPK(parent.Id, categoryId);
}
修改强>
选项1
@Entity
@Table(name="CHILD")
public class Child implements Serializable {
@EmbeddedId
private ChildPK id;
@ManyToOne
@JsonManagedReference
@JoinColumn(name="PARENT_ID", referencedColumnName = "PARENT_ID")
private Parent parent;
....
}
其他课程保持不变
选项2
@Entity
@Table(name="CHILD")
public class Child implements Serializable {
@EmbeddedId
private ChildPK id;
....
@PrePersist
protected void setIdsBeforeSave() {
//You set the parent ID, so wont be null, idk what category means, that why i just put the 0
this.id = new ChildPK(parent.Id, 0);
}
}