问题:
自己做一个小实验,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-...
ORA-01036:非法的变量名/编号 oracle特有的错误
在运行查询SELECT * FROM V$SESSION 会出现ORA-29275:部分多字节字符的错误,这是什么原因开始我不得其解,网上也没有介绍什么好办法。本文给出答案。
oracle12c程序连接时异常: ORA-01017: 用户名/口令无效; 登录被拒绝 的解决方案。
oracle报错ora-12541:TNS无监听程序
ORA-32001:write to spfile requested but no spfile is in use请求写入spfile,但没有使用spfile的解决方法 在输入以下语句中报了这样的错误: SQL>alter system set control_files=’/u01/app/oracle/oradata/prod/...
ORA-12154: TNS: 无法解析指定的连接标识符的解决方法
ORA-00031:标记要终止的会话解决方案; ORA-00031:标记要终止的会话解决方案;
错误描述:oracle远程连接服务器出现 ORA-12170 TNS:连接超时 错误检查:有很多是oracle自身安装的问题,但是我这里服务器配置正常,监听正常,服务正常,远程可以ping通服务器。 这里主要是防火墙问题,解决办法: ...
oracle 12 c ORA-01017: 用户名/口令无效; 登录被拒绝
NULL 博文链接:https://3w1h.iteye.com/blog/1211779
调整参数后引起,ORA-00838: Specified value of MEMORY_TARGET is too small, needs to be at least 3 2768M 的解决方案
最近在工作中遇到了一个问题,错误是Oracle dbca时报错:ORA-12547: TNS:lost contact,通过查找相关的资料终于找到了解决的方法,下面分享给大家,话不多说了,来一起看看详细的介绍吧。 环境: OS:RHEL6.5 x86-...
kettle连接oracle12C--报错ORA-28040 没有匹配的验证协议
-- 解决ORA-00904: "WMSYS"."WM_CONCAT": 标识符无效 的文件包....... -- 解决ORA-00904: "WMSYS"."WM_CONCAT": 标识符无效 的文件包....... -- 解决ORA-00904: "WMSYS"."WM_CONCAT": 标识符无效 的文件包....... ...
ORA-00001: 违反唯一约束条件 (.) ORA-00017: 请求会话以设置跟踪事件 ORA-00018: 超出最大会话数 ORA-00019: 超出最大会话许可数 ORA-00020: 超出最大进程数 () ORA-00021: 会话附属于其它某些进程;无法转换会话 ...
NULL 博文链接:https://springlin.iteye.com/blog/1520668
解决ORACLE TNS: 无法解析指定的连接标识符; 里面有步骤
有关表死锁的详细图片 博文链接:https://meteor-1988.iteye.com/blog/1568695