2015-03-09 3 views
3

Я хочу запустить этот запрос из JPA из моего кода. Но это не работает.JPA SET IDENTITY_INSERT не работает

Пожалуйста, помогите.

SET IDENTITY_INSERT "+tableName+" ON 

UPDATE

Точный код строки это

Query query = entityManager.createNativeQuery("SET IDENTITY_INSERT [tableName] ON"); 
int updated = query.executeUpdate(); 

Это дает 0 для обновления. Не дает никаких ошибок при выполнении этой строки. Но когда вы пытаетесь вставить после этого, это дает исключение нарушения ограничений, как показано ниже.

2015-03-09 15:46:52,922 WARN org.hibernate.util.JDBCExceptionReporter.logExceptions:233 - SQL Error: 544, SQLState: 23000 
2015-03-09 15:46:52,923 ERROR org.hibernate.util.JDBCExceptionReporter.logExceptions:234 - Cannot insert explicit value for identity column in table 'table_name' when IDENTITY_INSERT is set to OFF. 
2015-03-09 15:46:52,924 ERROR org.hibernate.event.def.AbstractFlushingEventListener.performExecutions:324 - Could not synchronize database state with session 
org.hibernate.exception.ConstraintViolationException: could not insert: [com.entities.EntityName] 
+0

Вы пытались использовать 'em.createNativeQuery()'? –

+0

Да, я пробовал это, и я выполнил код внутри транзакции, перенося операцию вставки между выводом и включением для identity_insert. Но по какой-то причине это не повлияло. – muasif80

+0

Я предполагаю, что все это работает в одной транзакции? –

ответ

0

Вам не нужны кавычки вокруг имени таблицы.

= "SET IDENTITY_INSERT "+ TABLENAME +" ON"

2

This и this помогли мне, и я получил эту работу, как показано ниже.

Также из этого link Я получил ответ, что JPA не поддерживает DDL-операцию.

Если кто-то может добавить к этому ответу, это тоже будет здорово.

EntityTransaction tx = entityManager.getTransaction(); 

try { 
// entitiesMap hold the entity class/table name pairs which have autoincrement primary keys in the sql server database 
if(entitiesMap.containsKey(entityName)){ 
    String tableName = entitiesMap.get(entityName); 
    Session session = (Session) entityManager.getDelegate(); 
    session.connection().createStatement().execute("SET IDENTITY_INSERT [dbo]." + tableName + " ON"); 
} 

tx.begin(); 
entityObject = jpaTemplate.merge(entity); 
tx.commit(); 

if(entitiesMap.containsKey(entityName)){ 
    String tableName = entitiesMap.get(entityName); 
    Session session = (Session) entityManager.getDelegate(); 
    session.connection().createStatement().execute("SET IDENTITY_INSERT [dbo]." + tableName + " OFF"); 
} 

return entityObject; 
} catch (Exception e) { 
}finally{ 
} 
+0

спасательный круг! :) Благодаря –