I am creating a spring boot application using MS SQL server. I have a requirement where I need to initialize USERS table in user_database database using data.sql file placed in /src/main/resources/ folder and rest of the tables should be created automatically in springboot_db database with the help of @Table annotation. Below is the code snippet.
applicaiton.properties file
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
data.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 (One of the entity file)
@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
}
If I am running my application keeping both the approaches separately than its working fine. When I merge both into a single application, it is showing following error.
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
答案 0 :(得分:2)
我遇到了同样的问题,并发现需要在属性中输入数据库名称。
Spring Boot示例:
spring:
datasource:
url: jdbc:sqlserver://localhost:1234;databaseName=DATABASENAMEHERE
username: USER
password: ******
driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver
答案 1 :(得分:1)
com.microsoft.sqlserver.jdbc.SQLServerException: Invalid object name 'tbl_configuration_details'.
You have defined table name as
CREATE TABLE tbl_users
But, in your code
@Table(name = "tbl_configuration_details")
Since, there isn't any object exists with the same name, you will get Invalid object name
exception.
答案 2 :(得分:0)
对两个表使用相同的数据库可以解决我的问题。但是,我仍然感到困惑的是为什么我不允许使用两个不同的数据库?
答案 3 :(得分:0)
我理解了这个错误。
SQL Server的本质是它是多数据库。
因此,我们有一个DataServer,其中包含的数据库中包含的数据库中的模式包含表。
因此,在您的情况下,JDBC驱动程序希望使用的是user_database.dbo.tbl_users而不是tbl_users。
由注释生成的Java必须生成绝对名称“ user_database.dbo.tbl_users”,而不是相对名称“ tbl_users”。
希望有帮助。
更新:如果您的表位于dbo中,则可能没有问题。