有关hibernate一对多编程遇到的问题:Caused by:java.sql.BatchUpdateException: ORA-02291

本文讨论了在使用Oracle数据库、Hibernate和触发器时遇到一对多操作冲突的解决方案,详细介绍了通过调整主键生成策略和触发器配置来解决外键关联问题的方法。

我在编程的时候遇到一个问题:是一个一对多的问题。

首先说一下我的系统的有关事项吧:我在oracle数据库中新建表,同时新建序列和触发器,hibernate使用的主键生成策略是“native”,在增加一条记录的时候,调用触发器

create or replace trigger COMPANY_tri
    before insert
    on COMPANY
    for each row
begin
       select COMPANY_seq.nextval into:new.id from dual;
    end;

在其他的增删改查方法中运行一直是正常的,前几天有一个一对多的问题,我想使用级联保存,但是总是不成功,原因是“多”的一方总是找不到“一”的一方的主键,

异常显示:Caused by:java.sql.BatchUpdateException: ORA-02291

Oracle给的解决方案是这样的(这是针对单纯的Oracle的解决方法)

 ORA-02291 integrity constraint (string.string) violated - parent key not found

Cause: A foreign key value has no matching primary key value.(原因:外键值没有匹配的主键值与它匹配)

 Action: Delete the foreign key or add a matching primary key.(解决:删除外键关联或者添加一个和外键匹配的主键值)


于是删除数据表中的”多“的一方的外键,此时运行能够成功,但是查看数据会发现,同时增加的”多“的一方所引用的外键值并不是“一”的一方的主键。所以是因为“一”的一方所生成的主键值和hibernate生成的“多”的一方所使用的外兼职不同引起的操作不成功。

究其根本,发现是因为我使用了触发器,hibernate生成的主键值和数据库中的触发器生成的主键值是不相同的,我禁止了触发器,将hibernate的主键生成策略变为”sequence“ 之后一对多的操作便成功了。


希望对出现同样问题的同学有所帮助

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值