HIbernate自动增量无法正常工作

时间:2014-04-02 13:40:03

标签: hibernate

我通过使用hibernate的自动增量属性来保存表的主键。在我的hbm.xml中,我的代码是

<id name="employeeId" type="integer" column="num_employee_id" >
<generator class="increment"/>
</id>

现在,当我从前端保存表中的任意两个/三行时。生成的employeeId为1,2,3,按增量顺序但如果我删除第三行然后再添加一行,则生成employeeId在其他情况下,如果我直接从后端添加一行(id生成为4)然后尝试从前端添加行,那么它将生成id为4并给出batchupdateexception。那么有没有解决方案。我使用mysql作为我的数据库。

2 个答案:

答案 0 :(得分:0)

解决方案是不使用增量生成器,它仅在内存中使用计数器,因此不知道其他应用程序对数据库所做的更改。这在the documentation

中有明确解释
  

增量

     

生成long,short或int 类型的标识符,仅当没有其他进程将数据插入同一个表时才是唯一的。不要在群集中使用。

(强调我的)

使用策略使用数据库生成ID(auto_increment列,序列,甚至表,具体取决于您的数据库功能。

但请注意,您不会找到任何可以保证ID没有漏洞的策略,因为通常无法有效地执行此操作,尤其是当多个踏板/进程同时访问数据库时,可能会回滚事务。 / p>

答案 1 :(得分:0)

当使用hibernate内置生成器&#39; increment&#39;时,它通过从启动时的最大主键值开始计数来生成标识符,在多JVM中不安全并使用数据库AUTO_INCREMENT它是为新行生成唯一标识的数据库。

在mySQL DB中,如果使用AUTO_INCREMENT,您应该在映射中使用identity来让数据库安全地生成唯一标识。

来自hibernate文档

增量

生成long,short或int类型的标识符,仅当没有其他进程将数据插入同一个表时才是唯一的。不要在群集中使用。

身份

支持DB2,MySQL,MS SQL Server,Sybase和HypersonicSQL中的标识列。返回的标识符的类型为long,short或int。