JPA Hibernate - 多种数据库方言和 nvarchar(length) 数据类型

Posted

技术标签:

【中文标题】JPA Hibernate - 多种数据库方言和 nvarchar(length) 数据类型【英文标题】:JPA Hibernate - Multiple Database Dialects and nvarchar(length) data type 【发布时间】:2019-06-19 06:09:21 【问题描述】:

我必须使用 JPA + Hibernate 做一个项目,其中我使用 3 种方言:mysql5InnoDBDialect、MSSQL2012Dialect 和 Oracle12cDialect。

现在我有一个规范告诉我,对于某些列来自:

Oracle 数据库,我必须使用 NVARCHAR2(LENGTH) 数据类型

MySql 数据库,我必须使用 VARCHAR(LENGTH) 数据类型

MSSQL 数据库,我必须使用 NVARCHAR(LENGTH) 数据类型

...这是我的问题..

    如果我使用:

    @Column(name="columnName" 长度 = 255) 私有字符串列名; hibernate 生成 varchar(255),这仅适用于 MySQL

    如果我使用:

    @Column(name="columnName", columnDefinition="nvarchar2(255)") 私有字符串列名; 这在 MySQL 中是不可能的,因为 columnDefinition 我得到错误,但在 oracle 中是可以的

    我尝试自定义 MySQL 方言创建

    公共类 CustomMySQL5InnoDBDialect 扩展 MySQL5InnoDBDialect

    public CustomMySQL5InnoDBDialect() 
        super();
        registerColumnType(Types.NVARCHAR, "nvarchar2($l)");//$l not $1
        registerHibernateType(Types.NVARCHAR, StandardBasicTypes.STRING.getName());
    
    

并在休眠配置中为 MySQL 方言提供此类。 如果我使用 columnDefinition 属性,我在 MySQL 中会遇到同样的问题。

你能帮忙解决这个问题吗?

【问题讨论】:

【参考方案1】:

解决方案是利用 JPA API 规范为您提供的功能来解决这种情况。为您需要支持的每个数据存储定义一个文件orm.xml,并在使用每个数据库时启用必要的文件。有关文件格式的详细信息,请参阅this link。这样您就无需考虑破解您正在使用的任何 JPA 提供程序的内部功能,并且您还保留了 JPA 提供程序的可移植性以及数据库的可移植性

放置特定于模式的信息信息(静态)Java 注释的想法很奇怪,在需要数据库可移植性时更是如此。

【讨论】:

以上是关于JPA Hibernate - 多种数据库方言和 nvarchar(length) 数据类型的主要内容,如果未能解决你的问题,请参考以下文章

JPA javax.persistence.PersistenceException:org.hibernate.MappingException:没有 JDBC 类型的方言映射:-101

Spring Data JPA 是不是在内部使用 Hibernate 以及如果我不提供方言属性,为啥我的应用程序正在运行?

Hibernate 数据库方言配置;no dialect mapping for jdbc type:-9;生僻字

使用 JPA 和 Hibernate 注册 SQL 函数

Hibernate的优缺点

SQL 方言如何在 hibernate 和 JOOQ 等框架内部实际工作