自动递增ID MYSQL 5的Hibernate问题

时间:2009-12-03 08:37:02

标签: hibernate mysql

所以,我只是站起来一个Spring Hibernate应用程序,我似乎无法正确获取我的映射文件。我正在使用MySql 5和一个自动递增键。这是我的映射文件的ID部分。

<hibernate-mapping>
     <class name="org.XXXXXXX.Contact" table="contact">
        <id name="id" column="id" type="int" unsaved-value="null">
            <generator class="native" />
        </id>

这是SQL生成的

  

插入联系人(title,first_name,middle_name,last_name,suffix,job_title,dob,passport_number,passport_expiration,employer,dietary_restrictions,secondary_contact_fname,secondary_contact_lname,secondary_contact_mname,secondary_contact_title,secondary_contact_suffix,secondary_contact_job_title,emergency_contact_name,emergency_contact_phone,emergency_contact_notes,is_company)值(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)

这是堆栈跟踪的重要部分:

org.hibernate.AssertionFailure:org.XXXXXXX.Contact条目中的null id(发生异常后不要刷新会话)

我尝试将unsaved-value设置为“0”和“-1”并通过线路发送它们。关于我做错了什么想法?

2 个答案:

答案 0 :(得分:11)

您必须记住,Hibernate是一个持久层,需要能够跟踪对象在数据库中的位置。因此,当它执行插入时,实际上需要查询自动增量计数器以查看下一个ID应该是什么。然后,它将ID插入对象并将对象插入数据库。所以对于hibernate在insert中做的事情,它需要先做一个select(除非你使用的是应用程序生成的某种GUID)。使用mySQL自动增量时,请使用“identity”生成器。

各种发电机的说明:

http://www.roseindia.net/hibernate/hibernateidgeneratorelement.shtml

一个hibernate XML代码片段:

 <id name="id" type="long" unsaved-value="null" >
    <column name="uid" not-null="true"/>
    <generator class="identity"/>
 </id>

答案 1 :(得分:0)

“增量”生成器不支持群集。如果某些其他进程插入到同一个表中。来自休眠的下一次插入将失败