spring-orm:6 HibernateJpaVendorAdapter源码解析

版本

spring-orm:6.1.3

源码

org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter

java 复制代码
public class HibernateJpaVendorAdapter extends AbstractJpaVendorAdapter {
	// 旧版本Hibernate的方言类是否存在标识
	private static final boolean oldDialectsPresent = ClassUtils.isPresent(
			"org.hibernate.dialect.PostgreSQL95Dialect", HibernateJpaVendorAdapter.class.getClassLoader());
	// jpa方言
	private final HibernateJpaDialect jpaDialect = new HibernateJpaDialect();
	...
	// 构建Jpa属性
	private Map<String, Object> buildJpaPropertyMap(boolean connectionReleaseOnClose) {
		Map<String, Object> jpaProperties = new HashMap<>();
		// 从 spring.jpa.database-platform 属性获取方言类名
		if (getDatabasePlatform() != null) {
			jpaProperties.put(AvailableSettings.DIALECT, getDatabasePlatform());
		}
		else {
			// 根据 spring.jpa.database 属性获取方言类
			Class<?> databaseDialectClass = determineDatabaseDialectClass(getDatabase());
			if (databaseDialectClass != null) {
				jpaProperties.put(AvailableSettings.DIALECT, databaseDialectClass.getName());
			}
		}
		// 如果设置了 spring.jpa.generate-ddl=true 则设置 hibernate.hbm2ddl.auto=update
		if (isGenerateDdl()) {
			jpaProperties.put(AvailableSettings.HBM2DDL_AUTO, "update");
		}
		// 如果设置了 spring.jpa.show-sql=true, 则设置 hibernate.show_sql=true
		if (isShowSql()) {
			jpaProperties.put(AvailableSettings.SHOW_SQL, "true");
		}
		// 如果需要在关闭会话时释放连接, 则设置 hibernate.connection.handling_mode=DELAYED_ACQUISITION_AND_HOLD (延迟获取,关闭会话时释放连接)
		if (connectionReleaseOnClose) {
			jpaProperties.put(AvailableSettings.CONNECTION_HANDLING,
					PhysicalConnectionHandlingMode.DELAYED_ACQUISITION_AND_HOLD);
		}

		// For SpringBeanContainer to be called on Hibernate 6.2
		jpaProperties.put("hibernate.cdi.extensions", "true");

		return jpaProperties;
	}
	
	// 根据数据库类型决定方言类
	protected Class<?> determineDatabaseDialectClass(Database database) {
		// 根据旧版本Hibernate的方言类是否存在判断Hibernate版本
		if (oldDialectsPresent) {  // Hibernate版本低于6.2
			return switch (database) {
				case DB2 -> DB2Dialect.class;
				case DERBY -> DerbyTenSevenDialect.class;
				case H2 -> H2Dialect.class;
				case HANA -> HANAColumnStoreDialect.class;
				case HSQL -> HSQLDialect.class;
				case INFORMIX -> Informix10Dialect.class;
				case MYSQL -> MySQL57Dialect.class;
				case ORACLE -> Oracle12cDialect.class;
				case POSTGRESQL -> PostgreSQL95Dialect.class;
				case SQL_SERVER -> SQLServer2012Dialect.class;
				case SYBASE -> SybaseDialect.class;
				default -> null;
			};
		}
		else {  // Hibernate版本高于6.2(包含)
			return switch (database) {
				case DB2 -> DB2Dialect.class;
				case DERBY -> org.hibernate.dialect.DerbyDialect.class;
				case H2 -> H2Dialect.class;
				case HANA -> HANAColumnStoreDialect.class;
				case HSQL -> HSQLDialect.class;
				case MYSQL -> MySQLDialect.class;
				case ORACLE -> OracleDialect.class;
				case POSTGRESQL -> org.hibernate.dialect.PostgreSQLDialect.class;
				case SQL_SERVER -> SQLServerDialect.class;
				case SYBASE -> SybaseDialect.class;
				default -> null;
			};
		}
	}
相关推荐
二进制person1 小时前
Java EE初阶 --多线程2
java·开发语言
橙子家2 小时前
Serilog 日志库简单实践(二):控制台与调试 Sinks(.net8)
后端
007php0072 小时前
某游戏大厂 Java 面试题深度解析(四)
java·开发语言·python·面试·职场和发展·golang·php
想不明白的过度思考者2 小时前
Rust——异步递归深度指南:从问题到解决方案
开发语言·后端·rust
西西学代码2 小时前
Flutter---个人信息(5)---持久化存储
java·javascript·flutter
陈果然DeepVersion2 小时前
Java大厂面试真题:Spring Boot+Kafka+AI智能客服场景全流程解析(五)
java·spring boot·kafka·向量数据库·大厂面试·rag·ai智能客服
FAFU_kyp3 小时前
Spring Boot 邮件发送系统 - 从零到精通教程
java·网络·spring boot
脚踏实地的大梦想家3 小时前
【Docker】P2 Docker 命令:从Nginx部署到镜像分享的全流程指南
java·nginx·docker
ConardLi3 小时前
Easy Dataset 已经突破 11.5K Star,这次又带来多项功能更新!
前端·javascript·后端
Blossom.1183 小时前
把AI“编”进草垫:1KB决策树让宠物垫自己报「如厕记录」
java·人工智能·python·算法·决策树·机器学习·宠物