当我尝试通过hibernate提交到SQL Server
时,我收到JDBC错误当IDENTITY_INSERT设置为OFF时,无法在表'Report'中为identity列插入显式值
我正在使用由包含
的netbeans生成的映射<class name="orm.generated.Report" table="Report" schema="dbo" catalog="DatabaseName">
<id name="id" type="int">
<column name="ID" />
<generator class="assigned" />
</id>
在我看来,它应该正确地进行身份插入。
有关如何解决这个问题的想法吗?
编辑:
一些链接到文档,为后代,
http://www.hibernate.org/hib_docs/v3/reference/en-US/html/mapping.html#mapping-declaration-id-generator
http://www.roseindia.net/hibernate/hibernateidgeneratorelement.shtml
答案 0 :(得分:8)
除非“IDENTITY_INSERT”设置为“ON”,否则无法插入SQL Server中的标识列。由于您的生成器类是“已分配”,因此Hibernate假定您在保存对象之前在Java中为“id”设置显式值,并且Hibernate可以直接将值插入数据库。你需要:
答案 1 :(得分:1)
最好使用像Integer这样的包装类而不是原始的int。
以您的代码为例
<class name="orm.generated.Report" table="Report" schema="dbo" catalog="DatabaseName">
<id name="id" type="java.lang.Integer">
<column name="ID" />
<generator class="assigned" />
</id>
答案 2 :(得分:1)
这是适合我的东西。根据需要进行调整。
@SuppressWarnings("deprecation")
public static void saveWithOverwrittenId(Session session, Object entity) {
String tableName = entity.getClass().getSimpleName();
boolean identityInsertSetToOn = false;
try {
session.connection().createStatement().execute("SET IDENTITY_INSERT "+tableName+" ON");
identityInsertSetToOn = true;
session.beginTransaction();
session.saveOrUpdate(entity);
session.getTransaction().commit();
} catch (SQLException e) {
session.getTransaction().rollback();
throw new RuntimeException(e);
} finally {
if (identityInsertSetToOn) {
try {
session.connection().createStatement().execute("SET IDENTITY_INSERT "+tableName+" OFF");
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
}
}
在我的例子中,SQL Server表与Entity类具有相同的名称。对你来说,这可能不是真的。因此,一种解决方案是将表名称作为参数。
答案 3 :(得分:1)
更改生成器类的类型
在
<id name="id" type="long">
<column name="Id" />
<generator class="assigned" />
</id>
在
<id name="id" type="long">
<column name="Id" />
<generator class="native" />
</id>
现在这将有效!
答案 4 :(得分:1)
尝试将生成器类的类型从“已分配”更改为“标识”,它对我有用