关于Hibernate save方法执行之后得到的id与数据库中实际存入值的id不一致的问题

在使用Hibernate的save方法时,发现返回的id与数据库实际生成的id不符,原因是数据库中存在触发器。当Hibernate获取sequence的下一个值并设置id后,触发器在保存时再次改变id。解决方案是为每个实体类定义特定的sequence,并在Hibernate配置中使用,避免触发器的影响。通过修改实体类的注解和数据库sequence设置,问题得以解决。
摘要由CSDN通过智能技术生成

今天在写一个程序时,发生了件很奇怪的事,以前一直没有注意到。

这次的级联操作我不用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,从而影响下一步操作的正确性。


因此呢,我是把数据库中的触发器去掉,

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值