繁体   English   中英

Hiberate问题,jdbc IDENTITY_INSERT设置为OFF

[英]Hiberate problems, jdbc IDENTITY_INSERT is set to OFF

当我尝试通过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

除非“IDENTITY_INSERT”设置为“ON”,否则无法插入SQL Server中的标识列。 由于您的生成器类是“已分配”,因此Hibernate假定您在保存对象之前在Java中为“id”设置显式值,并且Hibernate可以直接将值插入数据库。 你需要:

  1. 选择不同的生成器类,例如“native”
  2. 将IDENTITY_INSERT设置为“ON”

最好使用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>

这对我有用。 根据需要进行调整。

@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类具有相同的名称。 对你来说,这可能不是真的。 那么,一种解决方案是将表名称作为参数。

更改生成器类的类型

之前

<id name="id" type="long">
        <column name="Id" />
        <generator class="assigned" />
    </id>

<id name="id" type="long">
        <column name="Id" />
        <generator class="native" />
    </id>

现在这将工作!

尝试将生成器类的类型从“已分配”更改为“标识”,它对我有用

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM