Java 保存具有parend子关系的Hibernate实体失败,出现外键错误
我被违反-在尝试保存Hibernate实体时未找到父密钥 我有母公司:Java 保存具有parend子关系的Hibernate实体失败,出现外键错误,java,hibernate,Java,Hibernate,我被违反-在尝试保存Hibernate实体时未找到父密钥 我有母公司: @Entity @Table(name = "parents") public class Parent implements Serializable { private static final long serialVersionUID = 1246376778314918671L; @Id @GeneratedValue(strategy = GenerationType.SEQUENCE,
@Entity
@Table(name = "parents")
public class Parent implements Serializable {
private static final long serialVersionUID = 1246376778314918671L;
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "seq")
@SequenceGenerator(name = "seq", sequenceName = "PARENT_ID_SEQ", allocationSize = 1)
@Column(name = "parent_id")
private long parentId;
@Column(name = "display_name")
@Size(min = 1, max = 128)
@NotBlank
private String displayName;
@JsonManagedReference("childAssignments")
@OneToMany(mappedBy = "parent", fetch = FetchType.LAZY, cascade = CascadeType.ALL, orphanRemoval=true)
private Set<ChildAssignment> childAssignments = new HashSet<ChildAssignment>(0);
//regular getters and setters here
}
在创建父对象和childAssignments对象之后,我将向父对象添加childAssignment
ChildAssignment ca = new ChildAssignment();
ca.setSiteId(1);
// I do not set parent_id here since I do not know it and expecting Hibernate to figure it out
parent.getChildAssignments().add(childAssignment);
session.save(parent);
预期结果是使用ID保存新的父项,并在使用此ID保存子项后,但hibernate在保存时似乎不知道父项的ID,我应该如何建立关联以使其工作?或者父id字段上的一些注释
已更新
我试图删除父_id或将其设置为@Transient on childAssignment entity,get new error无法将NULL插入表中,很明显Hibernate正在尝试插入父_id,但没有填充它
在子对象上设置父对象也没有帮助
ChildAssignment ca = new ChildAssignment();
ca.setSiteId(1);
ca.setParent(parent)
parent.getChildAssignments().add(childAssignment);
session.save(parent);
我错过了什么
已解决
我解决了一个问题,改变了我的孩子
@Transient -- add transient (just to have it)
@Column(name = parent_id", insertable = false, updatable = false) -- add insertable and updatable both equals to false
private parentId;
.....
@ManyToOne
@JoinColumn(name = "parent_id") -- remove insertable = false, updatable = false options
private Parent parent;
您需要执行以下操作:
ca.setParent(parent);
还有
如果指定双边关系,则必须在Java代码中分配双方,就像纯Java代码一样
其次,您对“parentId”列的声明是多余的。Hibernate将自动为您创建该类。请查看我的子实体类的示例。我认为在提供的示例中我没有正确的解决方案,我不应该更改任何数据库设置来完成它。您好,这可能很好地解决了问题。。。但是如果你能提供一点关于它如何工作以及为什么工作的解释就好了:)别忘了——堆栈溢出上有很多新手,他们可以从你的专业知识中学到一两件事——对你来说很明显的事情对他们来说可能不是这样。不,它不是ca.setNotification(parent);parent.getchildAssignments().add(ca);问题是尚未设置子-父\u id,它如何知道如何设置?它知道如何设置,因为您应该调用ca.setParent(parent)。这样做的能力是Hibernate/JPA存在理由的一部分。您几乎不应该关心键值,尤其是将它们指定给属性。
ca.setParent(parent);