|
|
|
hibernate + mssql identity
|
|||
|---|---|---|---|
|
#18+
Как заставить hibernate работать с identity-ключами в mssql? Указаны соответствующие аннотации Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. Сохраняем новый объект: Код: java 1. 2. 3. в логе видим правильно сформированный insert, без поля order_id; запись в таблицу вставляется; но в hibernate операция валится Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. ну или "A result set was generated for update" если по-английски. Ошибка идет из драйвера. Насколько я понимаю, операция вставки возвращает не количество вставленный строк, а курсор (result set) Как побороть эту ошибку? Управлять сервером я не могу. Может, какой-то параметр в конфиге hibernate? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.10.2015, 13:09 |
|
||
|
hibernate + mssql identity
|
|||
|---|---|---|---|
|
#18+
ivanra, Триггеры есть на таблице? INSERT сам по себе не падает? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.10.2015, 13:21 |
|
||
|
hibernate + mssql identity
|
|||
|---|---|---|---|
|
#18+
IDENTITY ключ, значение которого генерится при вставке, триггеров никаких нет. Полагаю, что даже на чистом jdbc с mssql надо работать как-то по особенному, поскольку будет валиться executeUpdate. Вот: Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.10.2015, 13:36 |
|
||
|
hibernate + mssql identity
|
|||
|---|---|---|---|
|
#18+
ivanraIDENTITY ключ, значение которого генерится при вставке, триггеров никаких нет. Я знаю. Никогда аналогичных проблем с SQL Server не испытывал. Хотя использовал разные версии лет 7. ivanraПолагаю, что даже на чистом jdbc с mssql надо работать как-то по особенному, поскольку будет валиться executeUpdate. Вот: Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. Дело либо в драйвере, либо в конфигурации SQL Server. Можно попробовать JTDS, как вариант. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.10.2015, 13:43 |
|
||
|
hibernate + mssql identity
|
|||
|---|---|---|---|
|
#18+
SET NOCOUNT ON/OFF ни на что не влияет? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.10.2015, 13:47 |
|
||
|
hibernate + mssql identity
|
|||
|---|---|---|---|
|
#18+
ivanra, Запустите executeQuery() вместо executeUpdate(), интересно посмотреть чего оно там вообще вернуть пытается. Больше всего похоже что на таблице триггер, который возвращает курсор. Или это какая-то ультра модная фишка. Какой версии сервер? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.10.2015, 13:55 |
|
||
|
hibernate + mssql identity
|
|||
|---|---|---|---|
|
#18+
2 сервера, версия одна и та же (9.00.5057.00), на одном работает, на другом - нет. Запись в таблицу и там и там вставляется, разница - в возвращаемом результате. Видимо, дело в каких-то настройках, но я не dba и понятия не имею, какие вопросы задавать. И вообще, проблему желательно решить без изменения конфигурации сервера. Вот это не помогает Код: java 1. 2. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.10.2015, 14:13 |
|
||
|
hibernate + mssql identity
|
|||
|---|---|---|---|
|
#18+
ivanra, Ваш тестовый пример запустить можете? Получить через него ResultSet и посмотреть что внутри? Если это чужой сервер откуда уверенность что там нет триггера? Можно банально в IntelliJ IDEA запрос выполнить и посмотреть ResultSet. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.10.2015, 14:21 |
|
||
|
hibernate + mssql identity
|
|||
|---|---|---|---|
|
#18+
ivanra2 сервера, версия одна и та же (9.00.5057.00), на одном работает, на другом - нет. Всё больше подозрений падает на триггер. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.10.2015, 14:27 |
|
||
|
hibernate + mssql identity
|
|||
|---|---|---|---|
|
#18+
ivanraно я не dba и понятия не имею, какие вопросы задавать. Не нужно быть DBA чтобы понимать основы. Если сервера идентичные, нужно сверить структуры. Если у вас сторонний DBA, спросить у него почему INSERT возвращает данные, а не просто количество вставленных записей. Ну, и на форуме по SQL Server спросить отчего такое бывает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.10.2015, 14:29 |
|
||
|
hibernate + mssql identity
|
|||
|---|---|---|---|
|
#18+
с драйвером jtds ( http://jtds.sourceforge.net/) ошибок нет ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.10.2015, 17:55 |
|
||
|
hibernate + mssql identity
|
|||
|---|---|---|---|
|
#18+
Странно, попытался смоделировать на чистом jdbc, проблем нет. Таблица Код: sql 1. 2. 3. 4. Код примерно соответствует тому, что происходит в hibernate Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. insert.execute() тоже работает. insert.executeQuery() ругается, как и положено: Код: java 1. Так что драйвер вроде ни при чем. Хибернейт наверно тоже. Остается еще jboss-овский datasource, в прослойке между хибернейтом и драйвером. А jboss в этом проекте старый (4), и поменять его возможности нет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.10.2015, 14:59 |
|
||
|
hibernate + mssql identity
|
|||
|---|---|---|---|
|
#18+
ivanraТак что драйвер вроде ни при чем. Хибернейт наверно тоже. Остается еще jboss-овский datasource, в прослойке между хибернейтом и драйвером. А jboss в этом проекте старый (4), и поменять его возможности нет. Ни хибер, ни, тем более, JBoss тут не при чем. Проблема исключительно между драйвером и сервером. Возможно, в SET NOCOUNT. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.10.2015, 15:30 |
|
||
|
hibernate + mssql identity
|
|||
|---|---|---|---|
|
#18+
Вот точно. Я и не пробовал, поскольку в хибернейте почему-то не влияло. А добавил перед insert-ом вот эту строчку и получил точно такую же ошибку: Код: java 1. Нет этой строки - код отрабатывает на обоих серверах Есть строка - запись вставляется, но в коде ошибка на executeUpdate() (на обоих серверах) Код: java 1. Остается загадка, почему в связке jboss+hibernate разное поведение (там всё различие только в строке подключения) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.10.2015, 15:53 |
|
||
|
hibernate + mssql identity
|
|||
|---|---|---|---|
|
#18+
ivanraОстается загадка, почему в связке jboss+hibernate разное поведение (там всё различие только в строке подключения) Потому что эта переменная на одном сервере или аккаунте выставлена глобально, а на другом нет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.10.2015, 16:14 |
|
||
|
hibernate + mssql identity
|
|||
|---|---|---|---|
|
#18+
BlazkowiczivanraОстается загадка, почему в связке jboss+hibernate разное поведение (там всё различие только в строке подключения) Потому что эта переменная на одном сервере или аккаунте выставлена глобально, а на другом нет. Тогда бы и jdbc пример без строки "set NOCOUNT on" работал по разному ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.10.2015, 16:21 |
|
||
|
hibernate + mssql identity
|
|||
|---|---|---|---|
|
#18+
ivanra, SQL Server имеет вполне внятный логгер всех запросов. По нему можно попробовать отследить вызывает ли кто-то SET NOCOUNT или нет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.10.2015, 16:46 |
|
||
|
hibernate + mssql identity
|
|||
|---|---|---|---|
|
#18+
Я пошел с другого конца - с репозитория с исходниками, и нашел. Главное, знать, что искать :). Оказалось, что на том же сервере приложений работает небольшой сервис, вызывающий сохраненные процедуры. И перед каждой процедурой стоит "set NOCOUNT on". А пользуется тот сервис тем же источником данных (DataSource), что и мое приложение. Такие дела. Процедуры возвращают данные, поэтому без NOCOUNT сервис не заработал. Пришлось переделать: Код: sql 1. Теперь всё в порядке ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.10.2015, 20:23 |
|
||
|
hibernate + mssql identity
|
|||
|---|---|---|---|
|
#18+
Фактически, это всего лишь workaround для ошибки в драйвере sqljdbc. При включенном SET NOCOUNT ON метод PreparedStatement.executeUpdate() должен после insert-а возвращать 0, а не валиться с SQLException. Пытался развить эту тему в форуме MS SQL , но там, похоже, не поняли, о чем речь. Оставлю это тут, наверно, пригодится обитателям форума. При использовании драйвера sqljdbc не забывайте после включения опции SET NOCOUNT ON отключать её: SET NOCOUNT OFF ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.10.2015, 16:14 |
|
||
|
hibernate + mssql identity
|
|||
|---|---|---|---|
|
#18+
ivanraПри включенном SET NOCOUNT ON метод PreparedStatement.executeUpdate() должен после insert-а возвращать 0, а не валиться с SQLException. ну и дела(. Т.е. простое правило, которое я знаю ещё со времён дельфи-программирования: в каждой хранимке писать Код: java 1. не работает? Причём это ставят первой строкой и потом ничего в конце не выключают. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.10.2015, 16:25 |
|
||
|
hibernate + mssql identity
|
|||
|---|---|---|---|
|
#18+
Petro123, нет, опция работает. Но если её не отключить, то sqljdbc драйвер на CRUD запросах будет работать некорректно. jtds драйвер работает корректно ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.10.2015, 16:27 |
|
||
|
hibernate + mssql identity
|
|||
|---|---|---|---|
|
#18+
ivanraНо если её не отключить, то я про это и говорю. Никто её не оключает. Значит походу ты прав в глюке в драйвере? Я бы не отключал в коде ту штуку, а попробовал сменить дрова или как по другому решить проблему. IMHO ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.10.2015, 16:51 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=39083457&tid=2124770]: |
0ms |
get settings: |
5ms |
get forum list: |
10ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
163ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
64ms |
get tp. blocked users: |
1ms |
| others: | 206ms |
| total: | 464ms |

| 0 / 0 |
