Java 更新寄存器时,hibernate(JpaRepository)中的完整性约束存在问题

Java 更新寄存器时,hibernate(JpaRepository)中的完整性约束存在问题,java,sql,oracle,spring-data-jpa,Java,Sql,Oracle,Spring Data Jpa,我在数据库中有两个表,a和B。按以下方式定义: CREATE TABLE A ( id NUMBER, Name VARCHAR(100), CONSTRAINT pk_id PRIMARY KEY (id) ); CREATE TABLE B ( id NUMBER, a_id NUMBER, CONSTRAINT pk_id PRIMARY KEY (id), CONSTRAINT id_a_id FOREIGN KEY (a_id) REFERENCES a(id) );

我在数据库中有两个表,a和B。按以下方式定义:

CREATE TABLE A (
id NUMBER,
Name VARCHAR(100),
  CONSTRAINT pk_id PRIMARY KEY (id)
);

CREATE TABLE B (
id NUMBER,
a_id NUMBER,
  CONSTRAINT pk_id PRIMARY KEY (id),
  CONSTRAINT id_a_id FOREIGN KEY (a_id) REFERENCES a(id)
);
我想做的是,当B表有一个id为5的寄存器时,使用JpaRepository更新a表的寄存器“让我们假设id为5”

为此,y尝试的第一个想法是从A数据库中获取实体,修改名称值,删除旧寄存器,并保存一个带有更改的新寄存器:

@Transactional
void update()
{
 List<A> oldARegisterList = a.findById(5);
 A oldARegister = oldARegisterList.get(0);
 A newRegister = new A(oldARegister);
 a.delete(oldARegister);
 newRegister.setName("NewName");
 a.save(newRegister);
}
@Transactional
无效更新()
{
List oldARegisterList=a.findById(5);
A oldARegister=oldARegister.get(0);
新寄存器=新寄存器(旧寄存器);
a、 删除(旧登记簿);
newRegister.setName(“NewName”);
a、 保存(新注册);
}
但我得到了一个违反ORA-02291:完整性约束(id_a_id)的命令-找不到父密钥

然后我尝试删除B中的寄存器,删除并使用新名称创建A中的寄存器,最后再次创建B中的寄存器:

@Transactional
void update()
{
 List<A> oldARegisterList = a.findById(5);
 A oldARegister = oldARegisterList.get(0);
 B oldBRegister = oldARegister.getB();
 b.delete(oldBRegister);
 A newRegister = new A(oldARegister);
 a.delete(oldARegister);
 newRegister.setName("NewName");
 a.save(newRegister);
 b.save(oldBRegister);
}
@Transactional
无效更新()
{
List oldARegisterList=a.findById(5);
A oldARegister=oldARegister.get(0);
B oldBRegister=oldARegister.getB();
b、 删除(旧登记册);
新寄存器=新寄存器(旧寄存器);
a、 删除(旧登记簿);
newRegister.setName(“NewName”);
a、 保存(新注册);
b、 保存(旧注册表);
}
一个它不工作的以太会产生同样的问题,但若我首先执行删除B寄存器,然后更新A寄存器,最后重新创建B寄存器,它就工作了

因此,如果删除B更新A和重新创建B的过程在同一事务中,则该过程似乎不起作用

在同一笔交易中如何做到这一点


非常感谢。

首先,我应该注意到,您可以简单地更新
oldARegister
名称,而无需删除
oldbegister
,因为名称不是

oldARegister.setName("New Name");
a.save(oldARegister);
但是,如果您想在途中执行此操作,则应将
oldBRegister
设置为
newRegister
,如下所示:

oldBRegister.setA(newRegister)
b.save(oldBRegister);

为什么要执行删除操作?你为什么不在旧的注册对象中设置名称并提交呢?@codeLover问题是,通过这个我得到了一个ORA-02291:integrityconstraint@david.t_92您应该为新创建的对象设置外键。这就是为什么您可以简单地使用已更改的变量更改对象并保存它!多谢各位!