数据库是sqlserver 刚开始主键自增方式为native,后来把数据库复制重新建了个测试库,结构数据和表完全一样,但是用这个库时,自增长就不好使了,不能自动生成主键Id,改成incremnet就可以,这是为什么,求原因?????高分相送……在线等候!!
解决方案 »
- 求高手!!!!!关于指定的property没有getter method的问题
- 无法加载JSP类 求帮组
- ejb连接sql数据库代码!!!急求
- 关于tomcat的错误报告
- 使用ireport做报表,如何在一个报表里同时应用多个SQl语句?就剩下50分了!
- 为什么在一个页面设置的session的某个属性在另外一个页面不能获得?
- 疑难杂症:在jsp中调用activex控件出现的疑难杂症,请教了?????
- 菜鸟求助!JSP页面如何向后台action传送实体类
- 郁闷!import的问题!大家请帮忙一下(在线)
- 在java中如何向一个url发一个http请求,但在IE的地址栏中没有历史纪录
- jsp中读取数据库空字段时,怎么在显示时不显示null而显示空白?
- jsp文件在何处引用javascript文件较好?
主键按数值顺序递增。此方式的实现机制为在当前应用实例中维持
一个变量,以保存着当前的最大值,之后每次需要生成主键的时候
将此值加1作为主键。native
由Hibernate根据底层数据库自行判断采用identity、hilo、sequence
其中一种作为主键生成方式。个人认为,你测试库的数据时复制过来的,也就是说你的ID数据是复制的,并不是数据库自行判读采用identity生成的,所有当你插入数据的时候,数据库在采用identity无法识别你以前 的复制的数据,详细问题可以参考sqlserver主键自动增长原理。
而你是新的数据库且是复制过去的值,肯定是从最小值从新开始,而只是主键又已经存在。
所以插入的时候会出现唯一约束的问题。同理,sqlserver也是同样的原理。
而你改成了incremnet,incremnet应该是查询当前表主键的最大值+1的。
一般情况下,自己可以写一个table,专门用来保存数据库主键,将生产的主键保存在这个table中
每次添加条数据就去查询这个表的某条记录,然后将主键字段+1返回即可
这种手动维护主键的方式最大的好处就是解决数据库集群、多库共存、数据库备份迁移等等问题
不好的就是性能有些影响