powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / hibernate + mssql identity
22 сообщений из 22, страница 1 из 1
hibernate + mssql identity
    #39083428
ivanra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Как заставить hibernate работать с identity-ключами в mssql?
Указаны соответствующие аннотации
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
	@Id
	@GeneratedValue(strategy=GenerationType.IDENTITY)
	@Column(name="order_id")
	public Integer getOrderId() {
		return orderId;
	}
	public void setOrderId(Integer orderId) {
		this.orderId = orderId;
	}


Сохраняем новый объект:
Код: java
1.
2.
3.
order = new Order();
...
session.persist(order); // тут orderId=null


в логе видим правильно сформированный insert, без поля order_id;
запись в таблицу вставляется;
но в hibernate операция валится
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
org.hibernate.exception.GenericJDBCException: could not insert: [mypackage.db.Order]
	at org.hibernate.exception.SQLStateConverter.handledNonSpecificException(SQLStateConverter.java:103)
...
	at org.hibernate.event.def.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:107)
...
Caused by: com.microsoft.sqlserver.jdbc.SQLServerException: Результирующий набор создан для обновления.
...
	at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.executeUpdate(SQLServerPreparedStatement.java:315)
...


ну или "A result set was generated for update" если по-английски. Ошибка идет из драйвера. Насколько я понимаю, операция вставки возвращает не количество вставленный строк, а курсор (result set)

Как побороть эту ошибку?
Управлять сервером я не могу. Может, какой-то параметр в конфиге hibernate?
...
Рейтинг: 0 / 0
hibernate + mssql identity
    #39083457
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ivanra,

Триггеры есть на таблице? INSERT сам по себе не падает?
...
Рейтинг: 0 / 0
hibernate + mssql identity
    #39083486
ivanra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
IDENTITY ключ, значение которого генерится при вставке, триггеров никаких нет.
Полагаю, что даже на чистом jdbc с mssql надо работать как-то по особенному, поскольку будет валиться executeUpdate. Вот:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
Caused by: com.microsoft.sqlserver.jdbc.SQLServerException: Результирующий набор создан для обновления.
	at com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDriverError(SQLServerException.java:191)
	at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.doExecutePreparedStatement(SQLServerPreparedStatement.java:439)
	at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement$PrepStmtExecCmd.doExecute(SQLServerPreparedStatement.java:372)
	at com.microsoft.sqlserver.jdbc.TDSCommand.execute(IOBuffer.java:6276)
	at com.microsoft.sqlserver.jdbc.SQLServerConnection.executeCommand(SQLServerConnection.java:1793)
	at com.microsoft.sqlserver.jdbc.SQLServerStatement.executeCommand(SQLServerStatement.java:184)
	at com.microsoft.sqlserver.jdbc.SQLServerStatement.executeStatement(SQLServerStatement.java:159)
	at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.executeUpdate(SQLServerPreparedStatement.java:315)
...
...
Рейтинг: 0 / 0
hibernate + mssql identity
    #39083495
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ivanraIDENTITY ключ, значение которого генерится при вставке, триггеров никаких нет.
Я знаю. Никогда аналогичных проблем с SQL Server не испытывал. Хотя использовал разные версии лет 7.

ivanraПолагаю, что даже на чистом jdbc с mssql надо работать как-то по особенному, поскольку будет валиться executeUpdate. Вот:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
Caused by: com.microsoft.sqlserver.jdbc.SQLServerException: Результирующий набор создан для обновления.
	at com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDriverError(SQLServerException.java:191)
	at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.doExecutePreparedStatement(SQLServerPreparedStatement.java:439)
	at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement$PrepStmtExecCmd.doExecute(SQLServerPreparedStatement.java:372)
	at com.microsoft.sqlserver.jdbc.TDSCommand.execute(IOBuffer.java:6276)
	at com.microsoft.sqlserver.jdbc.SQLServerConnection.executeCommand(SQLServerConnection.java:1793)
	at com.microsoft.sqlserver.jdbc.SQLServerStatement.executeCommand(SQLServerStatement.java:184)
	at com.microsoft.sqlserver.jdbc.SQLServerStatement.executeStatement(SQLServerStatement.java:159)
	at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.executeUpdate(SQLServerPreparedStatement.java:315)



Дело либо в драйвере, либо в конфигурации SQL Server. Можно попробовать JTDS, как вариант.
...
Рейтинг: 0 / 0
hibernate + mssql identity
    #39083500
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SET NOCOUNT ON/OFF ни на что не влияет?
...
Рейтинг: 0 / 0
hibernate + mssql identity
    #39083525
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ivanra,

Запустите executeQuery() вместо executeUpdate(), интересно посмотреть чего оно там вообще вернуть пытается. Больше всего похоже что на таблице триггер, который возвращает курсор. Или это какая-то ультра модная фишка. Какой версии сервер?
...
Рейтинг: 0 / 0
hibernate + mssql identity
    #39083575
ivanra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2 сервера, версия одна и та же (9.00.5057.00), на одном работает, на другом - нет. Запись в таблицу и там и там вставляется, разница - в возвращаемом результате.
Видимо, дело в каких-то настройках, но я не dba и понятия не имею, какие вопросы задавать.
И вообще, проблему желательно решить без изменения конфигурации сервера.

Вот это не помогает
Код: java
1.
2.
	session.createSQLQuery("SET NOCOUNT ON").executeUpdate(); // и OFF тоже
	session.persist(order); // всё равно валится
...
Рейтинг: 0 / 0
hibernate + mssql identity
    #39083593
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ivanra,

Ваш тестовый пример запустить можете? Получить через него ResultSet и посмотреть что внутри? Если это чужой сервер откуда уверенность что там нет триггера?

Можно банально в IntelliJ IDEA запрос выполнить и посмотреть ResultSet.
...
Рейтинг: 0 / 0
hibernate + mssql identity
    #39083604
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ivanra2 сервера, версия одна и та же (9.00.5057.00), на одном работает, на другом - нет.
Всё больше подозрений падает на триггер.
...
Рейтинг: 0 / 0
hibernate + mssql identity
    #39083609
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ivanraно я не dba и понятия не имею, какие вопросы задавать.
Не нужно быть DBA чтобы понимать основы. Если сервера идентичные, нужно сверить структуры.
Если у вас сторонний DBA, спросить у него почему INSERT возвращает данные, а не просто количество вставленных записей.
Ну, и на форуме по SQL Server спросить отчего такое бывает.
...
Рейтинг: 0 / 0
hibernate + mssql identity
    #39083990
ivanra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
с драйвером jtds ( http://jtds.sourceforge.net/) ошибок нет
...
Рейтинг: 0 / 0
hibernate + mssql identity
    #39084893
ivanra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Странно, попытался смоделировать на чистом jdbc, проблем нет.
Таблица
Код: sql
1.
2.
3.
4.
CREATE TABLE [dbo].[TestTable](
	[id] [int] IDENTITY(1,1) NOT NULL,
	[comment] [varchar](50) NULL
)


Код примерно соответствует тому, что происходит в hibernate
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
	public static void main(String[] args) throws ClassNotFoundException, SQLException {
		Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
		Connection con = DriverManager.getConnection(con_str);
		PreparedStatement insert = null;
		ResultSet rs = null;
		try {
			insert = con.prepareStatement(
					"insert into TestTable(comment) values (?)",
					Statement.RETURN_GENERATED_KEYS );
			insert.setString(1, "test");
			insert.executeUpdate();
			// 
			rs = insert.getGeneratedKeys();
			rs.next();
			System.out.println(rs.getInt(1)); // identity
		} finally {
			if (rs!=null) rs.close();
			if (insert!=null) insert.close();
			con.close();
		}


insert.execute() тоже работает.
insert.executeQuery() ругается, как и положено:
Код: java
1.
com.microsoft.sqlserver.jdbc.SQLServerException: Инструкция не вернула результирующий набор.



Так что драйвер вроде ни при чем. Хибернейт наверно тоже. Остается еще jboss-овский datasource, в прослойке между хибернейтом и драйвером. А jboss в этом проекте старый (4), и поменять его возможности нет.
...
Рейтинг: 0 / 0
hibernate + mssql identity
    #39084962
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ivanraТак что драйвер вроде ни при чем. Хибернейт наверно тоже. Остается еще jboss-овский datasource, в прослойке между хибернейтом и драйвером. А jboss в этом проекте старый (4), и поменять его возможности нет.
Ни хибер, ни, тем более, JBoss тут не при чем. Проблема исключительно между драйвером и сервером. Возможно, в SET NOCOUNT.
...
Рейтинг: 0 / 0
hibernate + mssql identity
    #39084997
ivanra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вот точно. Я и не пробовал, поскольку в хибернейте почему-то не влияло. А добавил перед insert-ом вот эту строчку и получил точно такую же ошибку:
Код: java
1.
con.createStatement().execute("set NOCOUNT on");


Нет этой строки - код отрабатывает на обоих серверах
Есть строка - запись вставляется, но в коде ошибка на executeUpdate() (на обоих серверах)
Код: java
1.
Exception in thread "main" com.microsoft.sqlserver.jdbc.SQLServerException: Результирующий набор создан для обновления.



Остается загадка, почему в связке jboss+hibernate разное поведение (там всё различие только в строке подключения)
...
Рейтинг: 0 / 0
hibernate + mssql identity
    #39085041
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ivanraОстается загадка, почему в связке jboss+hibernate разное поведение (там всё различие только в строке подключения)
Потому что эта переменная на одном сервере или аккаунте выставлена глобально, а на другом нет.
...
Рейтинг: 0 / 0
hibernate + mssql identity
    #39085060
ivanra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
BlazkowiczivanraОстается загадка, почему в связке jboss+hibernate разное поведение (там всё различие только в строке подключения)
Потому что эта переменная на одном сервере или аккаунте выставлена глобально, а на другом нет.
Тогда бы и jdbc пример без строки "set NOCOUNT on" работал по разному
...
Рейтинг: 0 / 0
hibernate + mssql identity
    #39085121
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ivanra,

SQL Server имеет вполне внятный логгер всех запросов. По нему можно попробовать отследить вызывает ли кто-то SET NOCOUNT или нет.
...
Рейтинг: 0 / 0
hibernate + mssql identity
    #39085332
ivanra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я пошел с другого конца - с репозитория с исходниками, и нашел. Главное, знать, что искать :).
Оказалось, что на том же сервере приложений работает небольшой сервис, вызывающий сохраненные процедуры. И перед каждой процедурой стоит "set NOCOUNT on".
А пользуется тот сервис тем же источником данных (DataSource), что и мое приложение. Такие дела.
Процедуры возвращают данные, поэтому без NOCOUNT сервис не заработал. Пришлось переделать:
Код: sql
1.
set NOCOUNT on;exec вызов_процедуры;set NOCOUNT off


Теперь всё в порядке
...
Рейтинг: 0 / 0
hibernate + mssql identity
    #39087101
ivanra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Фактически, это всего лишь workaround для ошибки в драйвере sqljdbc.
При включенном SET NOCOUNT ON метод PreparedStatement.executeUpdate() должен после insert-а возвращать 0, а не валиться с SQLException.
Пытался развить эту тему в форуме MS SQL , но там, похоже, не поняли, о чем речь.
Оставлю это тут, наверно, пригодится обитателям форума.
При использовании драйвера sqljdbc не забывайте после включения опции SET NOCOUNT ON отключать её: SET NOCOUNT OFF
...
Рейтинг: 0 / 0
hibernate + mssql identity
    #39087118
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ivanraПри включенном SET NOCOUNT ON метод PreparedStatement.executeUpdate() должен после insert-а возвращать 0, а не валиться с SQLException.
ну и дела(.
Т.е. простое правило, которое я знаю ещё со времён дельфи-программирования: в каждой хранимке писать
Код: java
1.
SET NOCOUNT ON

не работает?
Причём это ставят первой строкой и потом ничего в конце не выключают.
...
Рейтинг: 0 / 0
hibernate + mssql identity
    #39087120
ivanra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Petro123,
нет, опция работает. Но если её не отключить, то sqljdbc драйвер на CRUD запросах будет работать некорректно. jtds драйвер работает корректно
...
Рейтинг: 0 / 0
hibernate + mssql identity
    #39087162
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ivanraНо если её не отключить, то
я про это и говорю. Никто её не оключает. Значит походу ты прав в глюке в драйвере?
Я бы не отключал в коде ту штуку, а попробовал сменить дрова или как по другому решить проблему.
IMHO
...
Рейтинг: 0 / 0
22 сообщений из 22, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / hibernate + mssql identity
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]