【问题标题】:SQL Server 2016 - Invalid object name 'hibernate_sequence'SQL Server 2016 - 无效的对象名称“hibernate_sequence”
【发布时间】:2018-08-08 19:40:03
【问题描述】:

我有一个映像备份,可以还原到 MS SQL Server 2016。 我有一个这样声明其 id 的实体:

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@XmlID
@XmlElement
@XmlJavaTypeAdapter(IntToStringXmlAdapter.class)
private Integer id;

当我保存收到的实体时:

Hibernate: select next_val as id_val from hibernate_sequence with (updlock, rowlock) 2018-02-28 22:05:41.935 
ERROR 18152 --- [nio-8080-exec-6] o.hibernate.id.enhanced.TableStructure   : could not read a hi value com.microsoft.sqlserver.jdbc.SQLServerException: Invalid object name 'hibernate_sequence'. 

...... 
2018-02-28 22:05:41.942  WARN 18152 --- [nio-8080-exec-6] o.h.engine.jdbc.spi.SqlExceptionHelper   : SQL Error: 208, SQLState: S0002 

2018-02-28 22:05:41.942 ERROR 18152 --- [nio-8080-exec-6] o.h.engine.jdbc.spi.SqlExceptionHelper   : Invalid object name 'hibernate_sequence'.

我已经手动创建了 SQL 服务器的序列,并确保它通过 SSMS 存在。

CREATE SEQUENCE hibernate_sequence
 AS INTEGER
 START WITH 1
 INCREMENT BY 1
 MINVALUE 1
 MAXVALUE 99
 NO CYCLE; 

尽管如此,我继续收到上一个错误。

任何想法我做错了什么?

提前谢谢你

【问题讨论】:

    标签: sql-server jpa spring-boot


    【解决方案1】:

    检查以下几点:

    • 您使用的是什么方言?
    • 您使用的是什么休眠版本? 版本 5 更改了 GenerationType.AUTO 行为
    • "hibernate.hbm2ddl.auto" 设置为 update 并查看它在数据库中创建的内容
    • 避免GenerationType.AUTO。将其显式设置为 GenerationType.IDENTITYGenerationType.SEQUENCE,具体取决于您想要什么或您的数据库支持。
    • 检查您是否拥有最新的 SQL Server JDBC 驱动程序。 I had issues with it migrating from hibertnate 4.3 to 5.0
    • 在休眠 5 中将 hibernate.id.new_generator_mappings 设置为 false

    【讨论】:

    • 谢谢。它与 IDENTITY 一起使用。方言是 org.hibernate.dialect.SQLServer2012Dialect。 Sprign Boot 版本 1.5.10.RELEASE.
    • 不幸的是,尽管我已更改为 IDENTITY,但它再次出现相同的错误。我已经升级到 5.2.3.Final 自从我阅读了这个错误报告:hibernate.atlassian.net/browse/HHH-11220 不幸的是这并没有解决问题。现在新生成的 SQL 是: Hibernate: select next_val as id_val from hibernate_sequence with (updlock, holdlock, rowlock) 2018-03-03 18:53:14.603 ERROR 5304 --- [nio-8080-exec-1] o.hibernate .id.enhanced.TableStructure:无法读取喜值 com.microsoft.sqlserver.jdbc.SQLServerException:无效的对象名称“hibernate_sequence”。
    • 这里是有关方言的详细信息:spring.datasource.driverClassName=com.microsoft.sqlserver.jdbc.SQLServerDriver spring.jpa.show-sql=true spring.jpa.hibernate.dialect=org .hibernate.dialect.SQLServer2012Dialect spring.jpa.hibernate.ddl-auto=update 我尝试了 IDENTITY 和 SEQUENCE 但结果是一样的。
    • Hibernate 4.3.5.Final 相同的代码可以成功执行,但 5.0.x 则不能(相同的代码,相同的 SQL 服务器)。
    • 查看 Hibernate 4->5 迁移指南。迁移时,我的 SQL Server 驱动程序出现问题 - 请查看我的答案中的更新。另外,在我看来,您仍在某处使用序列。也许没有明确地总结一些默认的休眠 5 行为。还要看看我添加的最后一点。
    【解决方案2】:

    看来您正在升级 SqlServer 版本。我在将 SqlServer 2012 升级到 SqlSever 2017 时遇到了这个问题。

    原因:驱动程序(jtds 或 sqlserver)和 SqlServer 2017+ 之间的对话不再考虑将 table “dbo.hibernate_sequence”作为解决方法。它特别需要名为 hibernate_sequence 的 sequence

    解决方案:删除名为 dbo.hibernate_sequence 的表并创建序列

    例子:

    USE [your_database_name]
    GO
    CREATE SEQUENCE [dbo].[hibernate_sequence] 
     AS [bigint]
     START WITH 10000000
     INCREMENT BY 1
     MINVALUE -9223372036854775808
     MAXVALUE 9223372036854775807
     CACHE 
    GO

    SqlServer Studio screenshot

    【讨论】:

      【解决方案3】:

      您确实需要查看文档。你在这里的查询是完全错误的。你为什么要在序列上使用查询提示?

      正确的语法应该是这样的。

      select next value FOR hibernate_sequence as next_val
      

      这是有关此的文档。 https://docs.microsoft.com/en-us/sql/t-sql/functions/next-value-for-transact-sql

      【讨论】:

      • 查询是由 Hibernate 自动生成的
      • 那么这是 Hibernate 的一个错误,因为它生成的代码甚至不接近正确。
      • Hibernate 在方言的帮助下创建查询。 Sql Server 2012 引入了序列,因此必须使用 org.hibernate.dialect.SQLServer2012Dialect 才能生成正确的查询。
      【解决方案4】:

      我在 spring boot 项目中也遇到了同样的错误。 在我的情况下,错误 com.microsoft.sqlserver.jdbc.SQLServerException: Invalid object name 'sys.sequences' 正在显示,因为我使用的是没有 sys.sequences 对象的 sql server 2008 版本。

      我切换到 sql server 2017,它工作正常。

      【讨论】:

        猜你喜欢
        • 2018-04-22
        • 1970-01-01
        • 2023-02-07
        • 1970-01-01
        • 2019-12-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多