论坛首页 Java企业应用论坛

hibernate映射oracle自动增长序列

浏览 6567 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2011-11-09  
在oracle里面新建了一个HIBERNATE_SEQUENCE做为一个全局的sequence,给N个表用。
又建了一个a_sequence给A表特别用,同时添加触发器
每当对A表save一条记录后。就从a_sequence中取一个id.

但是出现了这样的问题:
我save完后能看到A表中的id值是a_sequence中的值
可是我立马去取这个刚刚存进去的记录时,想getid()出来的却是HIBERNATE_SEQUENCE里面的值

如何解决这个问题。使我能立马去取这个刚刚存进去的记录时,想getid()出来的就是我表中的ID值,一个正确的值
   发表时间:2011-11-09   最后修改:2011-11-09
yingjun055 写道
在oracle里面新建了一个HIBERNATE_SEQUENCE做为一个全局的sequence,给N个表用。
又建了一个a_sequence给A表特别用,同时添加触发器
每当对A表save一条记录后。就从a_sequence中取一个id.

但是出现了这样的问题:
我save完后能看到A表中的id值是a_sequence中的值
可是我立马去取这个刚刚存进去的记录时,想getid()出来的却是HIBERNATE_SEQUENCE里面的值

如何解决这个问题。使我能立马去取这个刚刚存进去的记录时,想getid()出来的就是我表中的ID值,一个正确的值

1.hibernate 大忌使用触发器
2.解决方案关闭此表的二级缓存
3.如果想要不断续流水号使用select max(id)+1 from ........
0 请登录后投票
   发表时间:2011-11-09  
抛出异常的爱 写道
yingjun055 写道
在oracle里面新建了一个HIBERNATE_SEQUENCE做为一个全局的sequence,给N个表用。
又建了一个a_sequence给A表特别用,同时添加触发器
每当对A表save一条记录后。就从a_sequence中取一个id.

但是出现了这样的问题:
我save完后能看到A表中的id值是a_sequence中的值
可是我立马去取这个刚刚存进去的记录时,想getid()出来的却是HIBERNATE_SEQUENCE里面的值

如何解决这个问题。使我能立马去取这个刚刚存进去的记录时,想getid()出来的就是我表中的ID值,一个正确的值

1.hibernate 大忌使用触发器
2.解决方案关闭此表的二级缓存
3.如果想要不断续流水号使用select max(id)+1 from ........



我们这里有多机去使用这个id号的,如果用max的话,会发生,多台服务去同时调用同一个id的号码。如果用锁的话,会发生死锁的问题~~
0 请登录后投票
   发表时间:2011-11-09  
触发做什么用?
0 请登录后投票
   发表时间:2011-11-10  
likgui 写道
触发做什么用?

create   or   replace   trigger   bef_ins_t_country_define
before   insert   on   t_country_define
referencing   old   as   old   new   as   new   for   each   row
begin
new.country_id=s_country_id.nextval;
end;
0 请登录后投票
   发表时间:2011-11-10  
yingjun055 写道
抛出异常的爱 写道
yingjun055 写道
在oracle里面新建了一个HIBERNATE_SEQUENCE做为一个全局的sequence,给N个表用。
又建了一个a_sequence给A表特别用,同时添加触发器
每当对A表save一条记录后。就从a_sequence中取一个id.

但是出现了这样的问题:
我save完后能看到A表中的id值是a_sequence中的值
可是我立马去取这个刚刚存进去的记录时,想getid()出来的却是HIBERNATE_SEQUENCE里面的值

如何解决这个问题。使我能立马去取这个刚刚存进去的记录时,想getid()出来的就是我表中的ID值,一个正确的值

1.hibernate 大忌使用触发器
2.解决方案关闭此表的二级缓存
3.如果想要不断续流水号使用select max(id)+1 from ........



我们这里有多机去使用这个id号的,如果用max的话,会发生,多台服务去同时调用同一个id的号码。如果用锁的话,会发生死锁的问题~~

那就只能用sequence,或者自己实现一个生成ID的功能
0 请登录后投票
   发表时间:2011-11-10  
java_user 写道
yingjun055 写道
抛出异常的爱 写道
yingjun055 写道
在oracle里面新建了一个HIBERNATE_SEQUENCE做为一个全局的sequence,给N个表用。
又建了一个a_sequence给A表特别用,同时添加触发器
每当对A表save一条记录后。就从a_sequence中取一个id.

但是出现了这样的问题:
我save完后能看到A表中的id值是a_sequence中的值
可是我立马去取这个刚刚存进去的记录时,想getid()出来的却是HIBERNATE_SEQUENCE里面的值

如何解决这个问题。使我能立马去取这个刚刚存进去的记录时,想getid()出来的就是我表中的ID值,一个正确的值

1.hibernate 大忌使用触发器
2.解决方案关闭此表的二级缓存
3.如果想要不断续流水号使用select max(id)+1 from ........



我们这里有多机去使用这个id号的,如果用max的话,会发生,多台服务去同时调用同一个id的号码。如果用锁的话,会发生死锁的问题~~

那就只能用sequence,或者自己实现一个生成ID的功能

嗯,看来,只能用用UUID,啥的了~~就是有为长,看上去不太爽~~~
0 请登录后投票
   发表时间:2011-11-10  
可以自己写一个id的生成,其大致的策略为,先缓存一定数量的Id。
0 请登录后投票
   发表时间:2011-11-10  
Technoboy 写道
可以自己写一个id的生成,其大致的策略为,先缓存一定数量的Id。

我们会有多个环境操作一个数据,这样,如果多个环境对同一个ID进行操作的话,可能会出来,ID号被改成相现的情况发生吧~~~
0 请登录后投票
   发表时间:2011-11-10  
yingjun055 写道
Technoboy 写道
可以自己写一个id的生成,其大致的策略为,先缓存一定数量的Id。

我们会有多个环境操作一个数据,这样,如果多个环境对同一个ID进行操作的话,可能会出来,ID号被改成相现的情况发生吧~~~

不会,你只要维持同一时间只会生成一个ID就行了
防止并发的话,始终是要有个地方要排队等待的
如果性能有影响,就分段生成
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics