Java 如何使用JPA存储库创建子实体而不首先设置对父实体的引用
我不清楚JPA/Hibernate文档为什么在尝试添加子实体时必须设置对manytone关系的父对象的引用 比如说, 如果我这样做两阶段添加: 第一阶段: 创建新的父级 脸红 第2阶段: 创建新的子对象 调用child.setParentIdparent.getParentId而不是child.setParentparent 脸红 为什么即使在我正在保存的子实体上设置parentId时,对父实体的外键引用也会违反NOTNULL约束?我希望能够自己管理孩子;它们的存在对父母没有影响 我想做的事可能吗?如果是这样的话,我需要将什么秘密的注释组合在一起 下面是一些代码来概述我的问题: Parent.javaJava 如何使用JPA存储库创建子实体而不首先设置对父实体的引用,java,hibernate,jpa,spring-data,spring-data-jpa,Java,Hibernate,Jpa,Spring Data,Spring Data Jpa,我不清楚JPA/Hibernate文档为什么在尝试添加子实体时必须设置对manytone关系的父对象的引用 比如说, 如果我这样做两阶段添加: 第一阶段: 创建新的父级 脸红 第2阶段: 创建新的子对象 调用child.setParentIdparent.getParentId而不是child.setParentparent 脸红 为什么即使在我正在保存的子实体上设置parentId时,对父实体的外键引用也会违反NOTNULL约束?我希望能够自己管理孩子;它们的存在对父母没有影响 我想做的事可能
您已经在@JoinColumnname=parent\u id中提到了nullable=false,在子实体中提到了nullable=false,updateable=false,这就是为什么会出现该错误。尝试删除它并再次执行它。当我删除该约束时,关系永远不会被添加,此外,我不希望该字段不为null吗?您自己在问题中说过,子实体的存在独立于父实体。那么,让它不可为null有什么意义呢?为了独立于父实体保存子实体,必须将父实体id设置为可空,否则数据库将不允许将数据保存在表中。而且你能包括确切的堆栈跟踪吗?我想你可能有不同的解释,我的意思是,我没有说子实体独立于父实体,我说父实体的存在独立于子实体,这意味着父实体可以与0个子实体存在。
@Entity
@Table(name = "parents")
public class Parent
{
protected String parentId;
protected Collection<Child> children;
public Parent()
{
}
@Id
@Column(name = "parent_id", columnDefinition = "VARCHAR(42) NOT NULL", nullable = false, length = 42, insertable = true, updatable = false)
public String getParentId()
{
return parentId;
}
public void setParentId(String parentId)
{
this.parentId = parentId;
}
@OneToMany(mappedBy = "parent", cascade = {CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REFRESH})
public Collection<Child> getChildren()
{
if(children == null){
children = new LinkedList<>();
}
return children;
}
public void setCards(Collection<Child> children)
{
this.children = children;
}
}
@Entity
@Table(name="children")
public class Child
{
protected String childId;
protected Parent parent;
@Id
@Column(name="card_id", columnDefinition="VARCHAR(42) NOT NULL", length=42, nullable=false, insertable=true, updatable=false)
public String getCardId()
{
return childId;
}
public void setCardId(String childId)
{
this.childId = childId;
}
@JsonIgnore
@ManyToOne(fetch=FetchType.LAZY, cascade=CascadeType.ALL)
@JoinColumn(name="parent_id", nullable = false, updatable=false)
public Parent getCardholder()
{
return parent;
}
public void setParent(Parent parent)
{
this.parent = parent;
}
}