JPA SET IDENTITY_INSERT无效。

4

我希望从我的代码中使用JPA运行这个查询,但它没有工作。

请帮忙。

SET IDENTITY_INSERT "+tableName+" ON

更新

这行代码如下:

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]

你尝试过使用 em.createNativeQuery() 吗? - Predrag Maric
是的,我尝试过这样做,并在事务中执行了代码,在identity_insert的on和off之间包装了插入操作。但由于某种原因,它没有产生任何效果。 - muasif80
我假设所有这些都在同一个事务中运行? - Alan Hay
是的,我相信 JPA 不能像这样运行 ddl 语句,我需要获取底层的 Hibernate 会话并尝试。Session session = entityManager.unwrap(Session.class); - muasif80
1
所以这实际上是一个关于如何暂时将实体的自增设置为false的JPA问题。 - Neil Stockton
2个回答

3
这篇文章这篇文章 帮助了我,我按照以下方式使它们工作。

此外,从这个链接中,我得到的答案是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{
}

真是救命稻草啊!!:) 谢谢 - Tushar J Dudhatra

0

表名周围不需要引号。

="SET IDENTITY_INSERT "+tableName+" ON"


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接