MySQL方言重构

发布者    |       讨论 Hibernate ORM

从Hibernate ORM 5.2.8开始,MariaDB获得自己的Hibernate方言。

为什么?

在开发新的MariaDB方言时,我意识到MySQL方言将受益于简化版本层次结构。

以前,MySQL方言看起来是这样的

MySQL Dialects before refactoring, align=

如你所见,由于MySQL存储引擎的多样性(例如MyISAM和InnoDB),类层次结构已经出现了多个分支。一旦我们集成了Hibernate Spatial,MySQL方言变得更加复杂。

因此,我们创建了HHH-11473 Jira问题,该问题已在Hibernate 5.2.9中修复。

我们现在如何?

重构后,MySQL方言看起来如下

MySQL Dialects after refactoring, align=

以下方言已被弃用,因此它们未被添加到上面的类图中

MySQLMyISAMDialect

使用MySQLDialect,以及hibernate.dialect.storage_engine=myisam环境变量或系统属性。

MySQLInnoDBDialect

使用MySQLDialect,以及hibernate.dialect.storage_engine=innodb环境变量或系统属性。

MySQL5InnoDBDialect

使用MySQL5Dialect,以及hibernate.dialect.storage_engine=innodb环境变量或系统属性。

MySQL57InnoDBDialect

使用MySQL57Dialect

MySQL5InnoDBSpatialDialect

使用MySQL5SpatialDialect,以及hibernate.dialect.storage_engine=innodb环境变量或系统属性。

MySQL56InnoDBSpatialDialect

使用默认为InnoDB的MySQL56SpatialDialect

MySQLStorageEngine抽象封装了不同存储引擎之间的差异,通过将此责任委托给新的抽象,MySQL方言层次结构变得简单多了。

传统上,MySQL使用非事务性的MyISAM存储引擎,这也是所有旧于MySQL55Dialect的方言的默认存储引擎。从MySQL55Dialect开始,默认使用InnoDB存储引擎。

您可以通过提供 hibernate.dialect.storage_engine 环境变量或系统属性来始终覆盖默认的存储引擎。与其他 Hibernate 配置属性不同,此属性不得通过 persistence.xml 提供,因为方言是在配置管理机制启动之前启动的。

结论

已弃用的方言将在一段时间内可用,但它们肯定会在 Hibernate 的未来版本中被删除,因此您最好使用新的方言。这种重构有两个原因。首先,支持 MySQL 8.0 需要一个方言,而不是两个。其次,这使我们的用户也更容易使用,因为现在与特定 MySQL 版本关联的方言只有一个,选择更加直接。


返回顶部