Java JPA&x2B;冬眠+;Spring-生成ID的父子持久性导致外键错误
我在IntelliData的回答之后编辑了我的问题 分贝 在数据库中,我有,我不能做任何更改:Java JPA&x2B;冬眠+;Spring-生成ID的父子持久性导致外键错误,java,spring,hibernate,jpa,annotations,Java,Spring,Hibernate,Jpa,Annotations,我在IntelliData的回答之后编辑了我的问题 分贝 在数据库中,我有,我不能做任何更改: Table A { ID NUMBER(10, 0) NOT NULL DATE_DEBUT DATE NOT NULL DATE_FIN DATE ..... } Table B { ID NUMBER(10, 0) NOT NULL B_ID VARCHAR2(10 BYTE) NOT NULL } 在表中,ID是PK,它是生成的值。 表B(ID,B_
Table A {
ID NUMBER(10, 0) NOT NULL
DATE_DEBUT DATE NOT NULL
DATE_FIN DATE
.....
}
Table B {
ID NUMBER(10, 0) NOT NULL
B_ID VARCHAR2(10 BYTE) NOT NULL
}
在表中,ID是PK,它是生成的值。表B(ID,B_ID)中为PK。
B.ID是A.ID上的FK 实体 A. 存储库 但现在我明白了
ORA-02291: integrity constraint (FK_B_ID) violated - parent key not found
我不明白为什么,因为Hibernate以良好的顺序插入并且具有良好的值。。。我设法得到了那些日志:
DEBUG [main] org.hibernate.SQL(109) - insert into GOELAND_DEPLOI (DATE_DEBUT, DATE_FIN, ID) values (?, ?, ?)
Hibernate: insert into A (DATE_DEBUT, DATE_FIN, ID) values (?, ?, ?)
TRACE [main] o.h.t.d.sql.BasicBinder(81) - binding parameter [1] as [DATE] - [2016-06-22]
TRACE [main] o.h.t.d.sql.BasicBinder(81) - binding parameter [1] as [DATE] - [2016-06-22]
TRACE [main] o.h.t.d.sql.BasicBinder(81) - binding parameter [2] as [DATE] - [2016-06-22]
TRACE [main] o.h.t.d.sql.BasicBinder(81) - binding parameter [2] as [DATE] - [2016-06-22]
TRACE [main] o.h.t.d.sql.BasicBinder(81) - binding parameter [3] as [INTEGER] - [127]
DEBUG [main] org.hibernate.SQL(109) - insert into B (ID, B_ID) values (?, ?)
Hibernate: insert into B (ID, B_ID) values (?, ?)
TRACE [main] o.h.t.d.sql.BasicBinder(81) - binding parameter [1] as [INTEGER] - [127]
TRACE [main] o.h.t.d.sql.BasicBinder(81) - binding parameter [2] as [VARCHAR] - [TEST]
DEBUG [main] o.h.e.j.spi.SqlExceptionHelper(139) - could not execute statement [n/a]
java.sql.SQLIntegrityConstraintViolationException: ORA-02291: violation de contrainte d'intégrité (COMMON.FK_B_ID) - clé parent introuvable
如果还不够,我可以在myrepo.saveAndFlush(a)上添加更多日志 为了使b.ID有一个值,必须将a添加到b中,如下所示:
b.setA(a);
B的构造函数设置字段B.bId,但不设置字段B.a
更新: 尝试更改此选项:
@OneToMany(mappedBy = "a", fetch = FetchType.LAZY, cascade = { CascadeType.PERSIST })
private List<B> bs;
@OneToMany(mappedBy=“a”,fetch=FetchType.LAZY,cascade={CascadeType.PERSIST})
私人名单;
为此:
@OneToMany(fetch=FetchType.LAZY, cascade={CascadeType.PERSIST,CascadeType.MERGE, CascadeType.REMOVE})
@JoinColumn(name="ID")
@NotNull
private List<B> b;
@OneToMany(fetch=FetchType.LAZY,cascade={CascadeType.PERSIST,CascadeType.MERGE,CascadeType.REMOVE})
@JoinColumn(name=“ID”)
@NotNull
私人名单b;
类似于帖子上的答案。请让我知道它是否有效。似乎另一个改变了你的身份证。 您确定在a表上没有更新值的触发器吗 例如: Hibernate不知道该值已更改 两种解决方案:
- 编辑触发器:如果设置了id,则不要获取新的触发器
- 执行两个步骤:插入A、获取A、插入B(不推荐)
@OneToMany(fetch=FetchType.LAZY,cascade={CascadeType.PERSIST,CascadeType.MERGE,CascadeType.REMOVE})@JoinColumn(name=“ID”,nullable=false)私有列表b代码>但是如果不是hibernate,我必须从B类中删除A,尝试在插入B时设置3个值,而不是2个值。谢谢你的帮助
ORA-02291: integrity constraint (FK_B_ID) violated - parent key not found
DEBUG [main] org.hibernate.SQL(109) - insert into GOELAND_DEPLOI (DATE_DEBUT, DATE_FIN, ID) values (?, ?, ?)
Hibernate: insert into A (DATE_DEBUT, DATE_FIN, ID) values (?, ?, ?)
TRACE [main] o.h.t.d.sql.BasicBinder(81) - binding parameter [1] as [DATE] - [2016-06-22]
TRACE [main] o.h.t.d.sql.BasicBinder(81) - binding parameter [1] as [DATE] - [2016-06-22]
TRACE [main] o.h.t.d.sql.BasicBinder(81) - binding parameter [2] as [DATE] - [2016-06-22]
TRACE [main] o.h.t.d.sql.BasicBinder(81) - binding parameter [2] as [DATE] - [2016-06-22]
TRACE [main] o.h.t.d.sql.BasicBinder(81) - binding parameter [3] as [INTEGER] - [127]
DEBUG [main] org.hibernate.SQL(109) - insert into B (ID, B_ID) values (?, ?)
Hibernate: insert into B (ID, B_ID) values (?, ?)
TRACE [main] o.h.t.d.sql.BasicBinder(81) - binding parameter [1] as [INTEGER] - [127]
TRACE [main] o.h.t.d.sql.BasicBinder(81) - binding parameter [2] as [VARCHAR] - [TEST]
DEBUG [main] o.h.e.j.spi.SqlExceptionHelper(139) - could not execute statement [n/a]
java.sql.SQLIntegrityConstraintViolationException: ORA-02291: violation de contrainte d'intégrité (COMMON.FK_B_ID) - clé parent introuvable
b.setA(a);
@OneToMany(mappedBy = "a", fetch = FetchType.LAZY, cascade = { CascadeType.PERSIST })
private List<B> bs;
@OneToMany(fetch=FetchType.LAZY, cascade={CascadeType.PERSIST,CascadeType.MERGE, CascadeType.REMOVE})
@JoinColumn(name="ID")
@NotNull
private List<B> b;
Hibernate : seq.nextVal => 52
Hibernate : insert into A values (52...)
Database : trigger on insert A : call to seq.nextVal => 53
Databse : Value really inserted into A : 53