spring-orm:6 HibernateJpaVendorAdapter源码解析

版本

spring-orm:6.1.3

源码

org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter

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;
			};
		}
	}

相关推荐

  1. spring-orm:6 HibernateJpaVendorAdapter

    2024-02-20 20:54:02       52 阅读
  2. spring管理bean

    2024-02-20 20:54:02       26 阅读
  3. spring oauth2 authorization server 配置

    2024-02-20 20:54:02       54 阅读
  4. redisson-spring-boot-starter 自动化配置

    2024-02-20 20:54:02       48 阅读
  5. Spring之Bean生命周期

    2024-02-20 20:54:02       46 阅读
  6. Spring之事务底层

    2024-02-20 20:54:02       32 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-02-20 20:54:02       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-02-20 20:54:02       100 阅读
  3. 在Django里面运行非项目文件

    2024-02-20 20:54:02       82 阅读
  4. Python语言-面向对象

    2024-02-20 20:54:02       91 阅读

热门阅读

  1. TensorFlow 的基本概念和使用场景

    2024-02-20 20:54:02       48 阅读
  2. firewall 常用命令

    2024-02-20 20:54:02       61 阅读
  3. LeetCode 19.删除链表中的倒数第N个节点 改进算法

    2024-02-20 20:54:02       62 阅读
  4. 设置ant-design vue表单a-input输入类型为数字

    2024-02-20 20:54:02       46 阅读
  5. C Primer Plus(第六版)16.18 编程练习 第7题

    2024-02-20 20:54:02       41 阅读
  6. git rebase使用

    2024-02-20 20:54:02       41 阅读
  7. Prompt Engineering 高级提示工程技巧

    2024-02-20 20:54:02       50 阅读
  8. 使用sass开发web-components组件

    2024-02-20 20:54:02       44 阅读
  9. git_note

    2024-02-20 20:54:02       45 阅读
  10. 智能红包分配算法:实现均衡随机金额分配

    2024-02-20 20:54:02       48 阅读
  11. Android 15的开发者预览版

    2024-02-20 20:54:02       49 阅读
  12. 【工具类】非 sudo 运行 docker

    2024-02-20 20:54:02       58 阅读