Java 两次映射到子表-@OneToMany&@多对一
我正在尝试建模一个父实体,它有一个子实体集合(childHistory)和一个指向最后添加的子实体(currentChild)的指针Java 两次映射到子表-@OneToMany&@多对一,java,hibernate,jpa,Java,Hibernate,Jpa,我正在尝试建模一个父实体,它有一个子实体集合(childHistory)和一个指向最后添加的子实体(currentChild)的指针 类父类{ //单向的 @OneTONE(cascade=CascadeType.PERSIST,可选=false) @JoinColumn(name=“current\u child\u id”) 独生子女; //双向的 @OneToMany(mappedBy=“家长”) 私人名单儿童历史; 公共家长(){ currentChild=新的子项(此项); child
类父类{
//单向的
@OneTONE(cascade=CascadeType.PERSIST,可选=false)
@JoinColumn(name=“current\u child\u id”)
独生子女;
//双向的
@OneToMany(mappedBy=“家长”)
私人名单儿童历史;
公共家长(){
currentChild=新的子项(此项);
childHistory=newarraylist();
添加(currentChild);
}
公共无效添加(){
currentChild=新的子项(此项);
childHistory=newarraylist();
添加(currentChild);
}
}
班童{
@多通(可选=假)
@JoinColumn(name=“parent\u id”)
私人家长;
公共子女(父母对等){
this.parent=parent;
}
}
当前,当我试图保存父实体(并指望级联来持久化子实体)时,我得到了一个瞬态实体的异常。我无法事先保存父级,因为我初始化了父级中的所有内容
警告(导致异常…):
警告:HH000437:正在尝试保存一个或多个具有
与未保存的临时实体的不可空关联。未得救的人
在保存临时实体之前,必须先将其保存在操作中
从属实体。未保存的临时实体:([com.Parent#])
从属实体:([[com.Child#]])
不可为空
关联:([com.Child.entity])
警告:HH000437:正在尝试保存一个或多个具有 与未保存的临时实体的不可空关联。未得救的人 在保存临时实体之前,必须先将其保存在操作中 从属实体。未保存的临时实体:
([com.Child#])
从属实体:([[com.Parent#]])
不可为空
关联:([com.Parent.currentChild])
是否有一种方法可以正确地对此进行建模,并且在hibernate中没有空db列
编辑:有关复制,请参见以下要点:例外情况是指保存临时实体,这意味着您正试图保存与非托管实体相关的实体,因为您的父级正在级联一个子级,那么问题将在于子级历史,由于这是一种双向关系,因此也会使子对象级联
@OneToMany(mappedBy = "parent",cascade=CascadeType.PERSIST)
private List<Child> childHistory;
@OneToMany(mappedBy=“parent”,cascade=CascadeType.PERSIST)
私人名单儿童历史;
如何保存实体em.persist(新父项())代码>我省略了一些给定的细节(id、entitymanager等)您是否可以共享您的服务“我看不出重点”。重点是它将清楚地显示问题的根本原因,即您在保存之前没有设置双向关系的双方。我用要点更新了问题,以重现问题。不是问题-错误不是NRE。现在问题已解决。我将尝试提出一个示例项目。无论我如何移动级联,都无法解决该问题。即使使用级联,也会出现暂时性问题?在保存父实例时,在关系child>parent上进行级联将不会产生任何效果。因此,是否尝试保存子实例?
@OneToMany(mappedBy = "parent",cascade=CascadeType.PERSIST)
private List<Child> childHistory;