今天在写一个程序时,发生了件很奇怪的事,以前一直没有注意到。
这次的级联操作我不用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,从而影响下一步操作的正确性。
因此呢,我是把数据库中的触发器去掉,