【问题标题】:SQL Server 2012 / 2018 - Invalid object nameSQL Server 2012 / 2018 - 无效的对象名称
【发布时间】:2019-07-10 11:38:33
【问题描述】:

我正在开发一个应用程序,该应用程序通过 Hibernate 框架访问运行 SQL Server 2012 的数据库。但是,我无法弄清楚如何使用我的序列来生成要添加的新记录的 ID;每当我尝试将新对象实例保存到我的数据库表时,都会出现异常。要保存的类如下:

package com.xantrix.webapp.entities;

import java.io.Serializable;
import java.util.Date;

import javax.persistence.Basic;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;
import javax.persistence.TableGenerator;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;

@Entity
@Table(name = "Coupons")
public class Coupons implements Serializable
{
    private static final long serialVersionUID = -2788720560904709897L;

    @Id
    //@GeneratedValue(strategy=GenerationType.TABLE)
    /*
    @TableGenerator(
        name="Coupons",
        table="Progressivi",
        pkColumnName="Tipo",
        valueColumnName="Progressivo",
        allocationSize=200
        )
        */
    @SequenceGenerator(name="Coup_Gen", sequenceName="Test_Seq")
    @GeneratedValue(generator="Coup_Gen")
    //@GeneratedValue(generator="Coupons")
    @Column(name = "Id")
    private long id;

    @Temporal(TemporalType.TIME)
    @Column(name = "Data")
    private Date dataCreaz;

    @Basic
    private int idDeposito;

    @Basic
    private int qta;

    @Basic
    private double valore;

    @ManyToOne
    @JoinColumn(name = "IdCliente", referencedColumnName = "CODFIDELITY")
    private Clienti cliente;

    public Coupons()
    {

    }

    public long getId() {
        return id;
    }

    public void setId(long id) {
        this.id = id;
    }

    public Date getDataCreaz() {
        return dataCreaz;
    }

    public void setDataCreaz(Date dataCreaz) {
        this.dataCreaz = dataCreaz;
    }

    public int getIdDeposito() {
        return idDeposito;
    }

    public void setIdDeposito(int idDeposito) {
        this.idDeposito = idDeposito;
    }

    public int getQta() {
        return qta;
    }

    public void setQta(int qta) {
        this.qta = qta;
    }

    public double getValore() {
        return valore;
    }

    public void setValore(double valore) {
        this.valore = valore;
    }

    public Clienti getCliente() {
        return cliente;
    }

    public void setCliente(Clienti cliente) {
        this.cliente = cliente;
    }
}

如何更改 Hibernate 用于通过 Spring MVC 5 Web 应用查询 Microsoft SQL Server 序列的 SQL 查询?

由于错误,我无法将所有 Microsoft SQL Server 序列与 Spring MVC 5 Web App 的 Hibernate 一起使用

Invalid object name <sequence>.

此问题影响 Microsoft SQL Server 2012(但也影响 Microsoft SQL Server 2018)。

我在 Spring Tool Suite 4 中使用带有 Hibernate 的 Spring MVC 5 框架。 服务器是 Apache Tomcat 9.0.19。

我创建了一个名为

的用户
WebClient1

在 SQL Server Management Studio (Microsoft SQL Server 2012) 中。

我创建了以下序列:

USE [AlphaShop]
GO

USE [AlphaShop]
GO

/****** Object:  Sequence [dbo].[Test_Seq]    Script Date: 09/07/2019 10:56:28 ******/
CREATE SEQUENCE [dbo].[Test_Seq] 
 AS [bigint]
 START WITH 500
 INCREMENT BY 50
 MINVALUE 500
 MAXVALUE 9223372036854775807
 CACHE 
GO

以下 SQL 查询在 Microsoft SQL Server Management Studio 中成功运行:

SELECT NEXT VALUE FOR dbo.Test_Seq;

但如果我尝试访问 Web 应用程序的以下 URL,则会出现 HTTP 状态 500 错误: http://localhost:8080/alphashop/coupons/aggiungi/67000023 其中文本“67000023”是现有用户的 ID,如以下 SQL 查询的结果所示:

select * from CLIENTI
where CODFIDELITY = 67000023

在 Spring Tool Suite 4 的控制台中,我可以看到最新调用的 SQL 查询:

Hibernate: 
    select
        next_val as id_val 
    from
        Test_Seq with (updlock,
        rowlock)
lug 10, 2019 12:26:38 PM org.hibernate.id.enhanced.TableStructure$1$1 execute
ERROR: could not read a hi value
com.microsoft.sqlserver.jdbc.SQLServerException: Il nome di oggetto 'Test_Seq' non è valido.
    at com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDatabaseError(SQLServerException.java:256)
    at com.microsoft.sqlserver.jdbc.SQLServerStatement.getNextResult(SQLServerStatement.java:1621)

lug 10, 2019 12:26:38 PM org.hibernate.engine.jdbc.spi.SqlExceptionHelper logExceptions
WARN: SQL Error: 208, SQLState: S0002
lug 10, 2019 12:26:38 PM org.hibernate.engine.jdbc.spi.SqlExceptionHelper logExceptions
ERROR: Il nome di oggetto 'Test_Seq' non è valido.
lug 10, 2019 12:26:38 PM org.apache.catalina.core.StandardWrapperValve invoke
GRAVE: Servlet.service() for servlet [dispatcher] in context with path [/alphashop] threw exception [Request processing failed; nested exception is javax.persistence.PersistenceException: org.hibernate.exception.SQLGrammarException: error performing isolated work] with root cause
com.microsoft.sqlserver.jdbc.SQLServerException: Il nome di oggetto 'Test_Seq' non è valido.
    at com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDatabaseError(SQLServerException.java:256)
    at com.microsoft.sqlserver.jdbc.SQLServerStatement.getNextResult(SQLServerStatement.java:1621)

如您所见,Hibernate 生成了错误的 SQL 查询

    select
        next_val as id_val 
    from
        Test_Seq with (updlock,
        rowlock)

代替:

SELECT NEXT VALUE FOR dbo.Test_Seq;

成功了。

通过 Web 浏览器 Mozilla Firefox 68.0 在 Apache Tomcat 9 的 HTML 页面中呈现的 HTTP 状态 500 错误是:

Type Exception Report
Message Request processing failed; nested exception is javax.persistence.PersistenceException: org.hibernate.exception.SQLGrammarException: error performing isolated work
Description The server encountered an unexpected condition that prevented it from fulfilling the request.
Exception
org.springframework.web.util.NestedServletException: Request processing failed; nested exception is javax.persistence.PersistenceException: org.hibernate.exception.SQLGrammarException: error performing isolated work
    org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1013)
Root Cause
javax.persistence.PersistenceException: org.hibernate.exception.SQLGrammarException: error performing isolated work
    org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:154)
    org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:181)
Root Cause
org.hibernate.exception.SQLGrammarException: error performing isolated work
    org.hibernate.exception.internal.SQLStateConversionDelegate.convert(SQLStateConversionDelegate.java:106)
    org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:42)
Root Cause
com.microsoft.sqlserver.jdbc.SQLServerException: Il nome di oggetto 'Test_Seq' non è valido.
    com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDatabaseError(SQLServerException.java:256)
    com.microsoft.sqlserver.jdbc.SQLServerStatement.getNextResult(SQLServerStatement.java:1621)

在对象资源管理器中,我可以看到序列“dbo.Test_Seq”。 数据库名称为 AlphaShop。

我尝试执行以下SQL命令,但没有解决问题:

ALTER LOGIN WebClient1 WITH DEFAULT_DATABASE = [AlphaShop];

用户的身份验证类型为“SQL Server 身份验证”。 用户具有“公共”角色。

我不知道如何使用我的序列来生成要添加的新记录的 ID;每当我尝试将新对象实例保存到我的数据库表时,都会出现异常。

请帮忙。 提前谢谢了。 操作系统:Microsoft Windows 10 64bit 版本 2019.3

【问题讨论】:

    标签: sql-server hibernate jpa jakarta-ee


    【解决方案1】:

    我找到了解决方案: 您需要更改“application.properties”文件中的 Hibernate 属性以指定正确的方言(在我的情况下,正确的方言是“SQLServer2012Dialect”):

    #Hibernate properties
    hibernate.dialect = org.hibernate.dialect.SQLServer2012Dialect
    hibernate.show_sql = true
    hibernate.format_sql = true
    hibernate.hbm2ddl.auto = validate
    

    而不是错误

    #Hibernate properties
    hibernate.dialect =  org.hibernate.dialect.SQLServerDialect
    hibernate.show_sql = true
    hibernate.format_sql = true
    hibernate.hbm2ddl.auto = validate
    

    【讨论】:

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