`

hibernate oracle ORA-02291: 违反完整约束条件

阅读更多
问题:

自己做一个小实验,oracle数据库,使用hibernate作为中间件。在保存多对多关系时始终抛出一个外键约束的错误,大体内容如下:

(0 ms) [main] WARN : org.hibernate.util.JDBCExceptionReporter#logExceptions : SQL Error: 2291, SQLState: 23000

(10 ms) [main] ERROR: org.hibernate.util.JDBCExceptionReporter#logExceptions : ORA-02291: 违反完整约束条件 (STOCK.FK_INDUSTRY_R_STO_R_INDUSTRY) - 未找到父项关键字



(10 ms) [main] WARN : org.hibernate.util.JDBCExceptionReporter#logExceptions : SQL Error: 2291, SQLState: 23000

(10 ms) [main] ERROR: org.hibernate.util.JDBCExceptionReporter#logExceptions : ORA-02291: 违反完整约束条件 (STOCK.FK_INDUSTRY_R_STO_R_INDUSTRY) - 未找到父项关键字

数据库:

stock表和industry表是多对多的关系,中间表是industry_r_stock。使用powerdesigner设计的数据库。数据的脚本大致分为三部分:

1.       创建sequence

2.       创建数据库

3.       给库表添加before insert触发器

在代码中每个库表对应的文件,都配置了sequence的主键生成机制:

            <generator class="sequence" >

                     <param name="sequence">SEQUENCE_stock</param>

            </generator>

原因:

大体情况就是这样,现在说说产生问题的原因,经过反复检查,非常确定我的库表不存在外键约束定义上的问题,hibernate配置文件中的对应关系也没有问题,就是在保存stock时,无法保存中间表的数据,反复抛出上面的异常。

问题就出在使用powerdesigner设计pdm时,定义了主键的sequence,pd会创建before insert触发器:

CREATE TRIGGER TIB_BASIC_INFO BEFORE INSERT ON BASIC_INFO FOR EACH ROW

BEGIN

    SELECT SEQUENCE_stock.NEXTVAL INTO :NEW.ID FROM DUAL;

END;

每当有数据插入时,就会从序列中取出最新的值。但是,当我们使用hibernate作为中间件保存一个对象的时候,第一件事情就是查询库表主键的sequence(假定为1000),然后赋给当前要保存的对象A,当执行inser 语句时,就触发了before insert触发器,重新从sequence中获取了主键值(1001),导致当前保存对象的主键是1001,但是在代码中对象A的ID仍然是1000,所以在保存中间表数据时,会说破坏了外键约束。的确数据库中没有主键值为1000的记录。



备注1.

如果使用hibernate作为中间件,那么在数据库中就不要创建before insert触发器来获取NEW.ID。在*.hbm.xml中指定库表主键所使用的sequence。

备注2.

抛开hibernate不谈,如果创建了before insert触发器,那么就建立了一个库表和sequence之间的一个联系,我们使用SQL命令插入数据的时候就不需要考虑ID的值了。

insert into stock(code,name) values(‘code’,’name’);

备注3.

如果没有创建before insert触发器,那么库表的主键要使用一个sequence,必须在SQL命令中指定主键的值。insert into table1 values(sequence_name.curval,’code’,’name’);
分享到:
评论

相关推荐

    ora-01033:oracle initialization or shutdown in progress 解决方法

    ### ora-01033: Oracle Initialization or Shutdown in Progress 解决方法 #### 一、问题背景及原因 **标题**: “ora-01033: Oracle initialization or shutdown in progress 解决方法” **描述**: “ora-01033: ...

    Oracle错误码大全

    ORA-00001: 违反唯一约束条件 (.) ORA-00017: 请求会话以设置跟踪事件 ORA-00018: 超出最大会话数 ORA-00019: 超出最大会话许可数 ORA-00020: 超出最大进程数 () ORA-00021: 会话附属于其它某些进程;无法转换...

    Oracle 授权 ORA-00990: 权限缺失或无效

    在Oracle数据库管理中,"ORA-00990: 权限缺失或无效"是一个常见的错误代码,它表示用户尝试执行的操作没有足够的权限。这个错误通常发生在试图访问、修改或者管理数据库对象(如表、视图、索引等)时。在本篇文章中...

    如何处理错误ORA-29275:部分多字节字符

    通过以上方法,我们可以有效地解决ORA-29275错误,并提高Oracle数据库的整体稳定性和数据完整性。需要注意的是,在实际操作过程中,应当根据具体情况选择最适合的解决方案。例如,在某些情况下,调整字段长度可能是...

    oracle特有的错误:ORA-01036:非法的变量名/编号

    在Oracle数据库系统中,"ORA-01036:非法的变量名/编号"是一个常见的错误,通常出现在PL/SQL代码或者SQL查询语句中,当你尝试使用一个不正确或者未定义的变量时,Oracle数据库会抛出这个错误。这个错误可能是由于...

    oracle12c ORA-01017: 用户名/口令无效; 登录被拒绝 解决方案

    oracle12c程序连接时异常: ORA-01017: 用户名/口令无效; 登录被拒绝 的解决方案。

    oracle错误代码大全(超详细)

    ORA-00001: 违反唯一约束条件 (.) ORA-00017: 请求会话以设置跟踪事件 ORA-00018: 超出最大会话数 ORA-00019: 超出最大会话许可数 ORA-00020: 超出最大进程数 () ORA-00021: 会话附属于其它某些进程;无法转换会话 ...

    ORA-04052p5731178_92080_WINNT.zip

    ORA-00604: 递归SQL层1出现错误 ORA-03106: 致命的双工通信协议错误 ORA-02063: 紧接着line(源于dblink) 以及 ORA-04052: 在查找远程对象时出错 ORA-00604: 递归SQL层1出现错误 ORA-03120: 双工转换例行程序:整数...

    ORA-00060: 等待资源时检测到死锁--oracle 数据库表死锁异常

    在Oracle数据库系统中,"ORA-00060: 等待资源时检测到死锁" 是一个常见的错误提示,它表明两个或多个事务在执行过程中陷入了无法继续进行的状态,因为彼此都在等待对方释放资源。这种情况通常发生在并发操作中,比如...

    oracle报错ora-12541:TNS无监听程序

    oracle报错ora-12541:TNS无监听程序

    ORA-32001:请求写入spfile,但没有使用spfile的解决方法

    ORA-32001:write to spfile requested but no spfile is in use请求写入spfile,但没有使用spfile的解决方法 在输入以下语句中报了这样的错误: SQL&gt;alter system set control_files=’/u01/app/oracle/oradata/prod/...

    oracle报错大全(珍藏版)

    #### ORA-00107: Unable to Connect to Oracle 无法连接到Oracle。这可能是由于网络连接问题、安全策略限制或其他连接问题。 #### ORA-00108: Unable to Connect to Listener 无法连接到监听器。这可能是由于网络...

    ORA-12154: TNS: 无法解析指定的连接标识符的解决方法

    ORA-12154: TNS: 无法解析指定的连接标识符的解决方法

    oracle ora-各种常见java.sql.SQLException归纳

    ORA-00904 是一个常见的错误信息,通常发生在 SQL 语句中引用了一个不存在的列名。这种错误通常是由于开发者在编写 SQL 语句时,忘记了某个列名或写错了列名,导致 Oracle 无法找到该列名。解决这个错误的方法是,...

    oracle远程连接服务器出现 ORA-12170 TNS:连接超时 解决办法

    oracle远程连接服务器出现 ORA-12170 TNS:连接超时 解决办法,需要的朋友可以参考一下

    ORA-00904: "WM_CONCAT": 标识符无效

    在Oracle数据库中,"ORA-00904"是一个常见的错误代码,它表示尝试引用一个不存在或无效的标识符。在这个场景下,错误信息提到的是"WM_CONCAT"函数,这表明在Oracle 19c数据库环境中,用户尝试使用WM_CONCAT函数,但...

    调整参数后引起,ORA-00838: Specified value of MEMORY_TARGET is too small

    调整参数后引起,ORA-00838: Specified value of MEMORY_TARGET is too small, needs to be at least 3 2768M 的解决方案

    ORACLE ORA-00132 ORA-00214

    ### Oracle 错误 ORA-00132 和 ORA-00214 解析及处理 #### 一、错误概述 在Oracle数据库管理过程中,遇到ORA-00132和ORA-00214这类错误时,往往意味着数据库配置或启动过程中出现了问题。下面将对这两个错误进行...

    kettle连接oracle12C--报错ORA-28040 没有匹配的验证协议.rar

    当尝试使用Kettle连接Oracle 12c时,可能会遇到错误"ORA-28040:没有匹配的验证协议"。这个错误通常意味着客户端和服务器之间的安全认证不兼容。 **ORA-28040错误的解释:** 此错误通常出现在Oracle数据库服务器...

Global site tag (gtag.js) - Google Analytics