所以,我刚刚启动了一个 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
insert into contact (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) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
这是堆栈跟踪的重要部分:
org.hibernate.AssertionFailure: null id in org.XXXXXXX.Contact entry(发生异常后不刷新Session)
我已经尝试将未保存的值设置为“0”和“-1”并通过网络发送它们。关于我做错了什么的任何想法?
最佳答案
您必须记住,Hibernate 是一个持久层,需要能够跟踪对象在数据库中的位置。所以当它执行插入时,它实际上需要查询自动递增计数器以查看下一个 ID 应该是什么。然后它将 ID 插入到对象中,并将对象插入到数据库中。因此,要让 hibernate 在插入中执行操作,它首先需要进行选择(除非您使用的是应用程序生成的某种 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>
关于自动递增 ID MYSQL 5 的 hibernate 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1838520/