【问题标题】:How to resolve SQLServerException: Invalid object name?如何解决 SQLServerException:无效的对象名称?
【发布时间】:2018-07-13 18:53:57
【问题描述】:

我正在使用 MS SQL 服务器创建一个 Spring Boot 应用程序。我有一个要求,我需要使用放置在 /src/main/resources/ 文件夹中的 data.sql 文件初始化 user_database 数据库中的 USERS 表,其余表应在 @Table 注释的帮助下在 springboot_db 数据库中自动创建。下面是代码sn-p。

applicaiton.properties 文件

spring.datasource.platform=mssql
spring.datasource.url=jdbc:sqlserver://localhost;databaseName=springboot_db
spring.datasource.username=sa
spring.datasource.password=einfochips@123
spring.datasource.driver-class-name=com.microsoft.sqlserver.jdbc.SQLServerDriver
spring.jpa.show-sql=true
spring.jpa.hibernate.ddl-auto=create-drop
spring.datasource.initialize=true

数据.sql

USE master
IF EXISTS(select name from sys.databases where name='user_database')
DROP DATABASE user_database;
CREATE DATABASE user_database;
USE user_database;
CREATE TABLE tbl_users (
  id INTEGER NOT NULL IDENTITY(1,1),
  name VARCHAR(25),
  email  VARCHAR(50),
  username VARCHAR(25),
  password VARCHAR(225),
  gender VARCHAR(1),
  contact_number VARCHAR(12),
  address VARCHAR(150),
  country VARCHAR(20),
  newsletter BIT,
  framework VARCHAR(500),
  skill VARCHAR(500),
  role_id INTEGER,
  PRIMARY KEY (id)
);
INSERT INTO tbl_users 
(name, email, username, password, gender, contact_number, address, country, newsletter, framework, skill, role_id) 
VALUES 
('Admin User1', 'admin@gmail.com', 'admin', '$2a$10$WOf9uuaNfUgqpfXrfK1QiO.scUjxJMA.wENEu4c8GJMbPhFwbxMwu', 'f', 919979294062, 'Ahmedabad', 'India', 0, 'Spring MVC', 'Spring', 1);

AppConfiguration.java(实体文件之一)

@Entity
@Table(name = "tbl_configuration_details")
public class AppConfiguration implements Serializable {

    /**
     * 
     */
    private static final long serialVersionUID = 6657691404940352980L;

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "config_id")
    private Integer id;

    @Column(name = "schedule_time")
    private Integer scheduleTimePeriod;
// other variables and respective getter setters
}

如果我正在运行我的应用程序,则将这两种方法分开而不是正常工作。当我将两者合并到一个应用程序中时,它显示以下错误。

Caused by: com.microsoft.sqlserver.jdbc.SQLServerException: Invalid object name 'tbl_configuration_details'.
    at com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDatabaseError(SQLServerException.java:232) ~[mssql-jdbc-6.1.0.jre7.jar:na]
    at com.microsoft.sqlserver.jdbc.SQLServerStatement.getNextResult(SQLServerStatement.java:1672) ~[mssql-jdbc-6.1.0.jre7.jar:na]
    at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.doExecutePreparedStatement(SQLServerPreparedStatement.java:460) ~[mssql-jdbc-6.1.0.jre7.jar:na]
    at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement$PrepStmtExecCmd.doExecute(SQLServerPreparedStatement.java:405) ~[mssql-jdbc-6.1.0.jre7.jar:na]
    at com.microsoft.sqlserver.jdbc.TDSCommand.execute(IOBuffer.java:7535) ~[mssql-jdbc-6.1.0.jre7.jar:na]
    at com.microsoft.sqlserver.jdbc.SQLServerConnection.executeCommand(SQLServerConnection.java:2438) ~[mssql-jdbc-6.1.0.jre7.jar:na]
    at com.microsoft.sqlserver.jdbc.SQLServerStatement.executeCommand(SQLServerStatement.java:208) ~[mssql-jdbc-6.1.0.jre7.jar:na]
    at com.microsoft.sqlserver.jdbc.SQLServerStatement.executeStatement(SQLServerStatement.java:183) ~[mssql-jdbc-6.1.0.jre7.jar:na]
    at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.executeQuery(SQLServerPreparedStatement.java:317) ~[mssql-jdbc-6.1.0.jre7.jar:na]
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_144]
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) ~[na:1.8.0_144]
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) ~[na:1.8.0_144]
    at java.lang.reflect.Method.invoke(Unknown Source) ~[na:1.8.0_144]
    at org.apache.tomcat.jdbc.pool.StatementFacade$StatementProxy.invoke(StatementFacade.java:114) ~[tomcat-jdbc-8.5.23.jar:na]
    at com.sun.proxy.$Proxy92.executeQuery(Unknown Source) ~[na:na]
    at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.extract(ResultSetReturnImpl.java:70) ~[hibernate-core-5.0.12.Final.jar:5.0.12.Final]
    ... 94 common frames omitted

【问题讨论】:

  • 检查你的数据库连接字符串 data source = springboot_db in property file and user_database in your SQL file.
  • 是的,应该是这样的,只是因为我需要为两个不同的模块维护两个不同的数据库。
  • 你不需要添加hibernate.dialect 例如:spring.jpa.hibernate.dialect=org.hibernate.dialect.SQLServer2012Dialect 根据我的理解,你需要在springboot_db中创建tbl_configuration_details。

标签: java sql-server spring spring-mvc spring-boot


【解决方案1】:

com.microsoft.sqlserver.jdbc.SQLServerException:对象名称无效 'tbl_configuration_details'。

您已将表名定义为

CREATE TABLE tbl_users

但是,在你的代码中

@Table(name = "tbl_configuration_details")

由于不存在任何同名对象,你会得到Invalid object name异常。

【讨论】:

  • 两者都是不同的表。 tbl_users 应该从 sql 文件初始化, tbl_configuration_details 从注解初始化
  • @DharitaChokshi 但是应该在你的表中创建,如果没有,那么Invalid object name 是显而易见的
  • 我找不到你。能详细点吗?
  • @DharitaChokshi 最终,SQL 将在数据库层执行。如果您尚未在数据库中创建该表。然后,从 db 层你会得到这个异常
  • @DharitaChokshi 确保您可以访问该表。并使用与我注意到您定义的databaseName=springboot_db相同的数据库,但在sql中您使用的是USE user_database;两者都是不同的数据库
【解决方案2】:

我遇到了同样的问题,发现需要在属性中放入数据库名称。

Spring Boot 示例:

spring:
  datasource:
    url: jdbc:sqlserver://localhost:1234;databaseName=DATABASENAMEHERE 
    username: USER
    password: ******
    driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver

【讨论】:

    【解决方案3】:

    对两个表使用相同的数据库可以解决我的问题。但是,我仍然对为什么不允许我使用两个不同的数据库感到困惑?

    【讨论】:

      【解决方案4】:

      我理解错误。

      SQL Server 的本质是多数据库。

      所以我们有一个包含数据库的数据服务器,其中包含包含表的模式。

      因此,在您的情况下,JDBC 驱动程序需要 user_database.dbo.tbl_users 而不是 tbl_users。

      注解生成的Java必须生成绝对名称“user_database.dbo.tbl_users”而不是相对名称“tbl_users”。

      希望对您有所帮助。

      更新:如果您的表在 dbo 中,您可能没有问题。

      【讨论】:

        猜你喜欢
        • 2021-02-20
        • 2023-03-23
        • 2018-03-16
        • 1970-01-01
        • 2016-09-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多