English 中文(简体)
冬眠问题,jdbc IDENTITY_INSERT已设置为OFF。
原标题:
  • 时间:2009-01-16 22:08:50
  •  标签:

当我尝试通过Hibernate提交到SQL Server时,我遇到了JDBC错误。

当IDENTITY_INSERT设置为OFF时,无法为表Report中的标识列插入显式值。

我正在使用由NetBeans生成的包含映射的文件。

<class name="orm.generated.Report" table="Report" schema="dbo" catalog="DatabaseName">
    <id name="id" type="int">
        <column name="ID" />
        <generator class="assigned" />
    </id>

这在我看来似乎应该正确地执行身份插入。

有什么办法可以修复这个问题吗?

EDIT:
Some links to documentation, for posterity,
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中插入标识列。由于您的发生器类为“assigned”,因此Hibernate假定您在保存对象之前在Java中设置了“id”的显式值,并且Hibernate可以直接将值插入数据库。您需要执行以下操作之一:

  1. Pick a different generator class, such as "native"
  2. Set IDENTITY_INSERT to "ON"
问题回答

尝试将生成器类的类型从“assigned”改为“identity”,这对我有效。

这是我尝试过有效的方法。根据需要进行调整。

@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表与实体类具有相同的名称。对于您来说,可能不是这样。那么,一个解决办法就是将表名作为参数进行询问。

更改生成器类的类型

之前 (zhī qián)

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

之后

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

现在这会运作!

最好使用包装类,如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>




相关问题
热门标签