2009-12-03 52 views
7

所以,我只是站了起来,一个Spring Hibernate应用程序,我似乎无法得到我的映射文件。我正在使用MySql 5和一个自动递增键。这是我的映射文件的ID部分。自动递增ID的休眠问题MYSQL 5

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

这里是SQL生成

插入到接触(标题,如first_name,middle_name,姓氏,后缀,JOB_TITLE,DOB,passport_number,passport_expiration,雇主,dietary_restrictions,secondary_contact_fname,secondary_contact_lname,secondary_contact_mname, secondary_contact_title,secondary_contact_title,secondary_contact_job_title,emergency_contact_name,emergency_contact_phone,emergency_contact_notes,is_company)值(,,,,,,,,,,,,,,,,,,,,,,,,,, ?,?,?,?)

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

org.hibernate.AssertionFailure:在org.XXXXXXX.Contact进入空ID(发生异常后不要冲洗会议)

我有尝试将未保存的值设置为“0”和“-1”并通过电线发送。关于我做错什么的想法?

回答

10

你必须记住,Hibernate是一个持久层,需要能够跟踪对象在数据库中的位置。所以当它插入时,它实际上需要查询自动递增计数器来查看下一个ID应该是什么。然后它将ID插入到对象中并将该对象插入到数据库中。因此,为了让hibernate在插入时做,它首先使用需要做的选择(除非你使用应用程序生成的某种GUID)。当使用mySQL自动增量时,使用“身份”生成器。

各种发电机的说明:

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> 
+0

更改生成器类的工作。通过提供的链接,我可以解决我的问题。我最终起诉增量而不是身份。谢谢! – 2009-12-06 22:59:12

0

“增量” 发电机不支持群集友好。如果其他进程插入到同一个表中。下一次从休眠插入将失败