Spring Boot中使用CrudRepository连SQL Server遇SessionFactory创建失败问题
我在Spring Boot项目里尝试用CrudRepository连接SQL Server,结果操作时碰到了**"Can't make SessionFactory"**的错误,以下是我的代码及配置信息:
1. Repository代码
import org.springframework.data.repository.CrudRepository; import ge.sda.Database.entity.HoliDayEntity; import org.springframework.data.rest.core.annotation.RepositoryRestResource; @RepositoryRestResource public interface HoliDayReposiotry extends CrudRepository<HoliDayEntity, Integer>{ }
2. application.properties配置
# Server server.port=9008 spring.datasource.url=jdbc:sqlserver://url;servername=cra-test;databaseName=nData spring.datasource.username=sa spring.datasource.password=sa spring.datasource.driverClassName=com.microsoft.sqlserver.jdbc.SQLServerDriver spring.jpa.show-sql=true spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.SQLServerDialect spring.jpa.properties.hibernate.default_schema=dbo #spring.jpa.hibernate.dialect=org.hibernate.dialect.SQLServer2012Dialect spring.jpa.hibernate.ddl-auto=none # Logging logging.level.com.bytestree.restful=DEBUG
3. pom.xml配置片段
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>ge.psda.holiDays</groupId> <artifactId>holiDays</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>war</packaging> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <!-- 原配置内容被截断 --> </parent>
排查与解决方案
我之前处理过类似的问题,这个错误本质是Hibernate初始化SessionFactory失败,大概率和连接配置、依赖、实体映射有关,你可以按下面的步骤逐一排查:
1. 修正SQL Server连接URL格式
你的URL写法有问题,SQL Server JDBC URL的正确格式是两种:
- 基于主机+端口:
jdbc:sqlserver://<host>:<port>;databaseName=<dbname> - 基于实例名:
jdbc:sqlserver://<host>;instanceName=<instance>;databaseName=<dbname>
你现在把url占位符和servername参数混用了,应该改成:
# 示例:如果cra-test是主机名,直接用这个 spring.datasource.url=jdbc:sqlserver://cra-test;databaseName=nData # 如果需要指定端口(默认1433),加上端口号 # spring.datasource.url=jdbc:sqlserver://cra-test:1433;databaseName=nData
2. 确认SQL Server驱动依赖
检查pom.xml里是否引入了正确的驱动,Spring Boot推荐用官方starter:
<dependency> <groupId>com.microsoft.sqlserver</groupId> <artifactId>mssql-jdbc</artifactId> <scope>runtime</scope> </dependency>
如果是旧版SQL Server,要确保驱动版本和数据库版本匹配,避免兼容性问题。
3. 调整Hibernate方言配置
如果你的SQL Server是2012及以上版本,建议启用对应的方言,SQLServerDialect是针对旧版本的,可能会导致初始化失败:
# 替换原有的方言配置项,用更贴合版本的方言 spring.jpa.hibernate.dialect=org.hibernate.dialect.SQLServer2012Dialect
注意:Spring Boot中优先用spring.jpa.hibernate.dialect配置,比spring.jpa.properties.hibernate.dialect更规范。
4. 校验实体类映射
确保HoliDayEntity类正确配置了JPA注解,比如:
import javax.persistence.Entity; import javax.persistence.Id; @Entity public class HoliDayEntity { @Id private Integer id; // 其他字段、getter和setter方法 }
如果实体类缺少@Entity或者@Id注解,Hibernate无法正确映射表,会导致SessionFactory初始化失败。
5. 验证数据库连接权限
确认sa账号拥有nData数据库的访问权限,同时检查应用服务器能否连通SQL Server实例:
- 防火墙是否开放了1433端口(SQL Server默认端口)
- SQL Server是否允许远程连接
- 账号密码是否正确(可以用数据库客户端测试连接)
6. 查看详细错误日志
你已经开启了DEBUG级别的日志,仔细查看日志的错误堆栈,"Can't make SessionFactory"只是顶层错误,堆栈里的具体异常信息会告诉你真正的问题(比如连接超时、表不存在、映射错误等)。
内容的提问来源于stack exchange,提问作者Sagitarius

