D、 子ID)值(?,)]] java.sql.BatchUpdateException:ORA-01400:无法将NULL插入(“子表”“父表ID”)

D、 子ID)值(?,)]] java.sql.BatchUpdateException:ORA-01400:无法将NULL插入(“子表”“父表ID”),java,hibernate,Java,Hibernate,在前两行粗体字中,父母知道孩子的id,反之亦然。但是,在生成子sql时,它会将父id设置为null。发生了什么事 编辑: 作为参考,我使用以下hibernate JAR: org.hibernate:hibernate注释:jar:3.3.1.GA org.hibernate:hibernate:jar:3.2.6.ga我不知道为什么会出现这种行为,但我知道的是,这里没有双向的一对一关联 您有两种不同的一对一单向关联:父级使用子表的外键了解其子级,子级使用父表的外键了解其父级 顺便说一句,这种做

在前两行粗体字中,父母知道孩子的id,反之亦然。但是,在生成子sql时,它会将父id设置为null。发生了什么事

编辑: 作为参考,我使用以下hibernate JAR: org.hibernate:hibernate注释:jar:3.3.1.GA
org.hibernate:hibernate:jar:3.2.6.ga

我不知道为什么会出现这种行为,但我知道的是,这里没有双向的一对一关联

您有两种不同的一对一单向关联:父级使用子表的外键了解其子级,子级使用父表的外键了解其父级

顺便说一句,这种做法可能会导致一种情况,即父a有一个子B,而子B有一个父C

如果实际需要的是双向一对一关联,则应删除其中一个外键,并使用另一个外键映射关联。假设将CHILD_ID列保留在父表中,那么映射将是:

@OneToOne
@JoinColumn(name = "CHILD_ID")
@Cascade(CascadeType.ALL)
private Child child;


我不知道你为什么会有这种行为,但我知道你在这里没有一对一的双向关联

您有两种不同的一对一单向关联:父级使用子表的外键了解其子级,子级使用父表的外键了解其父级

顺便说一句,这种做法可能会导致一种情况,即父a有一个子B,而子B有一个父C

如果实际需要的是双向一对一关联,则应删除其中一个外键,并使用另一个外键映射关联。假设将CHILD_ID列保留在父表中,那么映射将是:

@OneToOne
@JoinColumn(name = "CHILD_ID")
@Cascade(CascadeType.ALL)
private Child child;


我把它修好了,虽然我不知道它为什么会起作用。我将级联从父级移动到子级,并保存子级而不是父级

在父级的注释类中,我有:

@OneToOne
@JoinColumn(name = "CHILD_ID")
@Cascade(CascadeType.ALL)
private Child child;
@OneToOne
@JoinColumn(name = "PARENT_ID")
private Parent parent;
@OneToOne
@JoinColumn(name = "CHILD_ID")
private Child child;
@OneToOne
@JoinColumn(name = "PARENT_ID")
@Cascade(CascadeType.ALL)
private Parent parent;
在孩子的注释类中,我有:

@OneToOne
@JoinColumn(name = "CHILD_ID")
@Cascade(CascadeType.ALL)
private Child child;
@OneToOne
@JoinColumn(name = "PARENT_ID")
private Parent parent;
@OneToOne
@JoinColumn(name = "CHILD_ID")
private Child child;
@OneToOne
@JoinColumn(name = "PARENT_ID")
@Cascade(CascadeType.ALL)
private Parent parent;
对于创建/持久化,我有:

Parent p = new Parent();
Child c = new Child();
p.setChild(c);
c.setParent(p);
getHibernateTemplate().save(p);
Parent p = new Parent();
Child c = new Child();
p.setChild(c);
c.setParent(p);
getHibernateTemplate().save(c);

我把它修好了,虽然我不知道它为什么会起作用。我将级联从父级移动到子级,并保存子级而不是父级

在父级的注释类中,我有:

@OneToOne
@JoinColumn(name = "CHILD_ID")
@Cascade(CascadeType.ALL)
private Child child;
@OneToOne
@JoinColumn(name = "PARENT_ID")
private Parent parent;
@OneToOne
@JoinColumn(name = "CHILD_ID")
private Child child;
@OneToOne
@JoinColumn(name = "PARENT_ID")
@Cascade(CascadeType.ALL)
private Parent parent;
在孩子的注释类中,我有:

@OneToOne
@JoinColumn(name = "CHILD_ID")
@Cascade(CascadeType.ALL)
private Child child;
@OneToOne
@JoinColumn(name = "PARENT_ID")
private Parent parent;
@OneToOne
@JoinColumn(name = "CHILD_ID")
private Child child;
@OneToOne
@JoinColumn(name = "PARENT_ID")
@Cascade(CascadeType.ALL)
private Parent parent;
对于创建/持久化,我有:

Parent p = new Parent();
Child c = new Child();
p.setChild(c);
c.setParent(p);
getHibernateTemplate().save(p);
Parent p = new Parent();
Child c = new Child();
p.setChild(c);
c.setParent(p);
getHibernateTemplate().save(c);

不幸的是,我仍然坚持使用db结构。如果我有两个不同的一对一单向关联,那么这就是我必须处理的。我按原样尝试了java修改(未修改表),收到了与以前相同的错误。请尝试将子实体中JoinColumn批注的nullable属性设置为false,以告知Hibernate此列中的null值是禁止的。当我将nullable=false添加到子实体的JoinColumn批注时,hibernate生成的sql现在甚至不尝试持久化父\u id。这仍然会导致错误,因为该列在db中定义为不可为null。如果删除级联并明确保存这两个实体,会发生什么情况?您尝试过更新版本的Hibernate吗?我将Hibernate和Hibernate注释更新为3.5.6-Final(这要求我删除对javax.persistence:persistence api的依赖,并添加对javassist:javassist的依赖)。我仍然收到了相同的错误。不幸的是,我仍然停留在db结构上。如果我有两个不同的一对一单向关联,那么这就是我必须处理的。我按原样尝试了java修改(未修改表),收到了与以前相同的错误。请尝试将子实体中JoinColumn批注的nullable属性设置为false,以告知Hibernate此列中的null值是禁止的。当我将nullable=false添加到子实体的JoinColumn批注时,hibernate生成的sql现在甚至不尝试持久化父\u id。这仍然会导致错误,因为该列在db中定义为不可为null。如果删除级联并明确保存这两个实体,会发生什么情况?您尝试过更新版本的Hibernate吗?我将Hibernate和Hibernate注释更新为3.5.6-Final(这要求我删除对javax.persistence:persistence api的依赖,并添加对javassist:javassist的依赖)。我仍然收到同样的错误。