为什么我的Native生成策略不仅仅在SQLServer上创建id?

时间:2015-06-03 14:35:14

标签: java sql-server hibernate

我有一个Java WebApplication,它使用Spring和Hibernate来创建和填充表。该表具有唯一的ID,该ID由以下Hibernate配置设置:

true

这适用于所有MySQL用户。但是,使用SQLServer 2008 Developer Edition的一个用户似乎发现,只要应用程序尝试将值放入此表,系统就会抛出类型错误:

<hibernate-mapping>
<class name="com.myco.TransactionImpl" table="myco_transaction">
    <id name="id" type="java.lang.Integer">
        <generator class="native">
            <param name="sequence">id_column_sequence</param>
        </generator>
    </id>
    <property name="user" type="java.lang.String">
        <column name="tx_user" not-null="false" unique="false" />
    </property>
   ...
</class>
</hibernate-mapping>

这个错误似乎很清楚。尚未生成ID。但为什么呢?

我们尝试使用SQL Server 2014和SQL Server Express 2008在内部解决此问题,但是当我们使用其中任何一个系统时,表中的插入工作并且会自动生成ID。

我不知道如何继续。我认为问题是以下之一:

  1. 用户以某种方式修改了他的数据库以不创建序列。如果可能,我该如何重现这个或询问用户如何检查?
  2. SQL Server 2008 Express和SQL Server 2008 Developer Edition存在根本区别。
  3. SQL Server 2008的休眠生成策略是错误的。
  4. 有关如何处理此问题的任何帮助或建议都非常感谢。

    更新

    SQL Server 2008计算机上的表定义:

    WARN org.hibernate.engine.jdbc.spi.SqlExceptionHelper - SQL Error: 339, SQLState: S0001
    ERROR org.hibernate.engine.jdbc.spi.SqlExceptionHelper - DEFAULT or NULL are not allowed as explicit identity values.
    ERROR Exception - Error attempting to save instance: 
    

    更新

    用户已声明此版本的SQL Server 2012 Developer Edition也失败了。

1 个答案:

答案 0 :(得分:1)

由于身份已经在桌面上定义并且有效,因此您无需插入身份。该表将在插入时自动生成。如果您想要插入自己的标识,则需要在执行插入之前运行IDENTITY_INSERT ON命令。一句警告,如果您尝试插入已生成的标识,插入将会出错。这种类型的操作通常在一张清新的空桌上完成。