Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/342.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JPA&x2B;冬眠+;Spring-生成ID的父子持久性导致外键错误_Java_Spring_Hibernate_Jpa_Annotations - Fatal编程技术网

Java JPA&x2B;冬眠+;Spring-生成ID的父子持久性导致外键错误

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_

我在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_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