Итак, я только что запустил приложение Spring Hibernate и, похоже, не могу правильно понять свой файл сопоставления. Я использую 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

вставить в контакт (title, first_name, middle_name, last_name, суффикс, job_title, dob, Passport_number, Passport_expiration, работодатель, диетические_ограничения, secondary_contact_fname, secondary_contact_lname, secondary_contact_mname, secondary_contact_title, secondary_contact_mname, secondary_contact_title, secondary_contact_suffix, Emergency_contact_suffix, Emer_contact_suffix), Emer_contact_suffix? ?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)

Вот важная часть трассировки стека:

Org.hibernate.AssertionFailure: нулевой идентификатор в записи org.XXXXXXX.Contact (не сбрасывать сеанс после возникновения исключения)

Я попытался установить несохраненное значение на «0» и «-1» и отправить их по сети. Есть идеи о том, что я делаю неправильно?

8
Ryan H 3 Дек 2009 в 11:37

2 ответа

Лучший ответ

Вы должны помнить, что Hibernate - это уровень постоянства и должен иметь возможность отслеживать, где находится объект в базе данных. Поэтому, когда он выполняет вставку, ему на самом деле нужно будет запросить счетчик автоинкремента, чтобы узнать, каким должен быть следующий идентификатор. Затем он вставляет идентификатор в объект и вставляет объект в базу данных. Итак, чтобы спящий режим выполнялся во вставке, он использует сначала необходимость выбора (если вы не используете какой-то GUID, сгенерированный приложением). При использовании автоинкремента mySQL используйте генератор «идентичности».

Объяснение различных генераторов:

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

Фрагмент кода XML для гибернации:

 <id name="id" type="long" unsaved-value="null" >
    <column name="uid" not-null="true"/>
    <generator class="identity"/>
 </id>
11
davidemm 3 Дек 2009 в 18:43
Смена класса генератора сработала. По предоставленной ссылке я смог исправить свою проблему. В итоге я подал в суд на инкремент, а не на личность. Спасибо!
 – 
Ryan H
7 Дек 2009 в 01:59

Генератор «Приращения» не подходит для кластеров. Если какой-то другой процесс вставляется в ту же таблицу. Следующая вставка из спящего режима не удастся

0
Maruthi 5 Сен 2013 в 11:02