hibernate 2.0 и @@identity в MSSQL
От: dimpon  
Дата: 01.12.03 12:17
Оценка:
Была проблема — замапить два класса (родитель и наследник) на две таблицы в базе (MSSQL), связанные по id.
В первой таблице (предназначенной для родителя) id поле было indentity.
Проще говоря_ hibrnaty при вставке строки (создании нового объекта) надо было вставить строку в первую таблицуб потом select @@identity вытащить сгенерированный базой ключ и вставить во вторую таблицу запись с этим ключем.
НО был очень удивлен, когда вместо сгенерированного зачения ключа вернулся 0.
Дальнейшее расследование JDBC показало, что select @@identity не вернет ключ сгенерированный при педыдущем Inserte если не закрыть Statement этого inserta. То есть надо делать так:

Statement st = conn.createStatement();
st.executeUpdate("insert into tab(name) values ('ABCDEF')");
st.close();


Statement sta = conn.createStatement();
ResultSet rs = sta.executeQuery("select @@identity");



копание в исходниках hibernate показало, что Statement не всегда закрывается, часто он возвращается в кеш, пришлось "довести напильником" — в классе net.sf.hibernate.persister.NormalizedEntityPersister в методе
Serializable insert(Object[] fields, Object object, SessionImplementor session)
добавить закрытие Statement (statement.close(). После этого все заработало, как и полагается. Согласно документации

Вопрос — кто сталкивался с подобной проблемой, может есть другой метод, или я что-то прогдядел в настройках ?
Метод "русского программиста" конечно работает, но все-таки остается чувство беспокойства...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.