关于Hibernate save方法执行之后得到的id与数据库中实际存入值的id不一致的问题
来源:互联网 发布:黄牛抢购软件 编辑:程序博客网 时间:2024/06/05 17:45
今天在写一个程序时,发生了件很奇怪的事,以前一直没有注意到。
这次的级联操作我不用hibernate帮我来做,我想自己实现它,所以我在service层的第二个操作之前得到第一个操作的id。
试验几次后,发现hibernate返回来的id与数据库中存的id不一致,差好多,几经研究,终于发现了问题,原来是我在数据库中加了触发器,导致这个问题。
我想大概是这样:
当执行this.getHibernateTemplate().save(obj)时,hibernate执行了三步操作:
1.去数据库中找sequence的下一个值,即应该存入的id
select
backrole_seq.nextval
from
dual
如果在实体类中没有指定是哪个sequence,它会去hibernate_sequence中找,如果不存在此序列,则会无法插入数据。
2.执行实体类的setId方法,将id赋进去.
3.执行sql的save方法。
因此,当数据库中本身存在着触发器时,在执行了sql的save方法之中,数据库本身又改变了它的id。然后才真正地存入到数据库中。
所以当数据库中有触发器时,会导致存入实体之后,再用getId()方法拿到的id并不是数据库中的id,从而影响下一步操作的正确性。
因此呢,我是把数据库中的触发器去掉,然后针对每一个实体类,都定义一个sequence,然后在hibernate层用此数据库建立的sequence就可以了。
@Id
@SequenceGenerator(name="backrole_s",sequenceName="backrole_seq")
@GeneratedValue(generator="backrole_s")
@Column(name="id")
public int getId() {
return id;
}
数据库中:
drop sequence backrole_SEQ;
create sequence backrole_SEQ
minvalue 1
maxvalue 999999999999999999999999999
start with 1
increment by 1
cache 20;
- 关于Hibernate save方法执行之后得到的id与数据库中实际存入值的id不一致的问题
- Hibernate 在事务管理下,save之后获取Id的方法
- 关于Hibernate中null id的问题
- hibernate entity使用sequence方式时,id增量50且与sequence值不一致的问题
- hibernate entity使用sequence方式时,id增量50且与sequence值不一致的问题
- 关于ios8之后touch Id的问题
- 得到数据库中id最大的记录
- 安卓中@id与@+id的区别与实际应用中的@id报错问题
- 安卓中@id与@+id的区别与实际应用中的@id报错问题
- Hibernate返回id比Oracle实际小1的问题
- Hibernate的save(obj)之后立刻通过obj.getId拿到这个持久化类的id值
- TP框架中数据库操作add(),save(),delete()方法返回的都是操作行的主键值(id)
- 页面下拉框显示值,存入数据库的是id
- Hibernate 中save方法运行成功之后却没有保存进数据库的原因
- extjs中关于数据库id不能重复的问题
- Hibernate 中执行 对Oracle 数据库执行 save 方式是报 序列不存在 的问题?
- android 中通过名字得到资源的ID的方法
- Linux进程的实际用户ID与有效用户ID
- 如何开启QtCreator的代码自动补全功能
- 结构体与类的区别
- 我们应该做什么产品-谈谈google的产品和发展
- 且行且走(8月15日,8月16日)
- 色环电阻识别法
- 关于Hibernate save方法执行之后得到的id与数据库中实际存入值的id不一致的问题
- gcc编译选项详解
- 线程小解
- 【贪心法求解最小生成树之Kruskal算法详细分析】---Greedy Algorithm for MST
- 在IPhone桌面的应用程序图标右上角显示数字
- php将字符串转成整型intval()函数逻辑
- 线程的信号量 PV操作
- GetProcAddress用法
- cygwin make:command not found