Java 如何使用JPA存储库创建子实体而不首先设置对父实体的引用

Java 如何使用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约束?我希望能够自己管理孩子;它们的存在对父母没有影响 我想做的事可能

我不清楚JPA/Hibernate文档为什么在尝试添加子实体时必须设置对manytone关系的父对象的引用

比如说,

如果我这样做两阶段添加:

第一阶段:

创建新的父级 脸红 第2阶段:

创建新的子对象 调用child.setParentIdparent.getParentId而不是child.setParentparent 脸红 为什么即使在我正在保存的子实体上设置parentId时,对父实体的外键引用也会违反NOTNULL约束?我希望能够自己管理孩子;它们的存在对父母没有影响

我想做的事可能吗?如果是这样的话,我需要将什么秘密的注释组合在一起

下面是一些代码来概述我的问题:

Parent.java


您已经在@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;
    }

}