Hibernian native 主键 与oracle从增序列触发器

Hibernian native 主键 与oracle自增序列触发器

<---!下面的内容理解可能是错误的,希望大家不要被误导-->

 

 

使用hibernate的自动建表功能,如果主键是int 且为 native ,则在建表语句的最后面hibernate会多出一个sql语句

“create sequence hibernate_sequence”,每添加一条记录,select hibernate_sequence.nextval from dual;insert into ProductionCategory (name, ID) values (?, ?);都会多一条elect hibernate_sequence.nextval from dual;的sql语句。但是个人觉得这个hibernate其实并没有在oracle中真正的创建了序列和触发器,因为在oracle中,你插入一条记录时设定id值的话,这个id值将会被保存,而如果是触发器则,无论你的id设置为何值,他都是从序列里面取出下一个值:

insert into method(id,name) values (125,'asd');

 

select * from method;

 

        ID NAME

---------- -------------------------

        21 asdfasd

        22 assadfasdd

        23 asd

 

由此可见,hibernate的sequence 只是在hibernate框架内部自己维持每个表格的自增,然后将自增的值写入数据库中,也就是在oracle中,hibernate并没有真正的创建senquence何trigger,表格的主键hibernate把他设置为assigned,然后id的值有hibernate自己生成,加到数据中,最后保存到数据库中。如果此时你在oracle中用sql语句添加了一条id较大的记录,hibernate执行插入时,还是从他自己的内部自增序列中取值,当内部自增的取值刚好等于我们在oracle中用sql插入的id相同时,hibernate不做插入动作,但是好像也不报错,当下一条记录要插入时,hibernate则继续插入工作。