ssh注解中主键生成策略无效

@Id@GeneratedValue(generator="UserInfoId")@GenericGenerator(name="UserInfoId",strateg... @Id
@GeneratedValue(generator="UserInfoId")
@GenericGenerator(name="UserInfoId", strategy="assigned")
@Column(name="id",unique=true,nullable=false)
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
entity类是这样写的,在注册或者插入数据时,saveorupdate()不管如何就是update,页面错误:org.springframework.orm.hibernate3.HibernateOptimisticLockingFailureException: Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1; nested exception is org.hibernate.StaleStateException: Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1都没有要更新的数据更新肯定错误啊,我要执行的是插入,不知道是不是注解写的主键生成策略有什么地方不对或写漏了,我是把原项目写成基于全注解的,后来就各种问题,求大神帮忙
展开
 我来答
射箭之道
推荐于2016-11-29 · TA获得超过280个赞
知道小有建树答主
回答量:279
采纳率:100%
帮助的人:119万
展开全部
@GeneratedValue(generator="UserInfoId")这行不对

可用的值如下:
increment
用于为long, short或者int类型生成 唯一标识。只有在没有其他进程往同一张表中插入数据时才能使用。 在集群下不要使用。
identity
对DB2,MySQL, MS SQL Server, Sybase和HypersonicSQL的内置标识字段提供支持。 返回的标识符是long, short 或者int类型的。
sequence
在DB2,PostgreSQL, Oracle, SAP DB, McKoi中使用序列(sequence), 而在Interbase中使用生成器(generator)。返回的标识符是long, short或者 int类型的。
hilo
使用一个高/低位算法高效的生成long, short 或者 int类型的标识符。给定一个表和字段(默认分别是 hibernate_unique_key 和next_hi)作为高位值的来源。 高/低位算法生成的标识符只在一个特定的数据库中是唯一的。
seqhilo
使用一个高/低位算法来高效的生成long, short 或者 int类型的标识符,给定一个数据库序列(sequence)的名字。
uuid
用一个128-bit的UUID算法生成字符串类型的标识符, 这在一个网络中是唯一的(使用了IP地址)。UUID被编码为一个32位16进制数字的字符串。
guid
在MS SQL Server 和 MySQL 中使用数据库生成的GUID字符串。
native
根据底层数据库的能力选择identity, sequence 或者hilo中的一个。
assigned
让应用程序在save()之前为对象分配一个标示符。这是 <generator>元素没有指定时的默认生成策略。
select
通过数据库触发器选择一些唯一主键的行并返回主键值来分配一个主键。
foreign
使用另外一个相关联的对象的标识符。通常和<one-to-one>联合起来使用。
sequence-identity
一种特别的序列生成策略,使用数据库序列来生成实际值,但将它和JDBC3的getGeneratedKeys结合在一起,使得在插入语句执行的时候就返回生成的值。目前为止只有面向JDK
1.4的Oracle 10g驱动支持这一策略。注意,因为Oracle驱动程序的一个bug,这些插入语句的注释被关闭了。(原文:Note comments on these insert statements are disabled due to a bug in the Oracle drivers.)
更多追问追答
追问
哥们,别做复制党
追答
你开始问的问题就那个,查帮助就能搞定,后来改的这个问题。。。其实是另一回事了。
在save方法里就是执行插入,但是 saveOrUpdate方法里执行的就不一定了。需要你的实体对象加上equals和hashCode方法,区别两个对象的方式改为ID只要ID一样,对象就一样。
因为你在对象瞬态的时候,变为持久态,可能会有ID一样的两个对象出现,第一次读取id=1的对象,和第二次读取id=1的对象,关闭session后,对象都已经游离。没办法确定是一个,所以需要重设equals和hashcode两个方法。
另外你的ID必须是自己指定的。因为你设置了assigned,所以不能指定数据库为你生成,你得自己加上。如果不加ID,hibernate当然不能向表插入一个没有主键的数据。
4237800
2013-03-25 · TA获得超过1356个赞
知道答主
回答量:112
采纳率:0%
帮助的人:73.6万
展开全部
assigned这是自己分配主键,不会自动生成的。
需要在保存的时候自己设置一个主键。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
yanghao40
2013-03-25 · 超过19用户采纳过TA的回答
知道答主
回答量:130
采纳率:0%
帮助的人:42.7万
展开全部
@GeneratedValue(strategy=GenerationType.IDENTITY)ID自增
追问
数据库id是varchar类型怎么自增
追答
哦,没看到类型是String的
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式