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

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

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

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

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

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

...这是我的问题..

  1. 如果我使用:

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

  2. 如果我使用:

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

  3. 我尝试自定义 MySQL 方言创建

    公共类 CustomMySQL5InnoDBDialect 扩展 MySQL5InnoDBDialect{

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

    }

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

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

【问题讨论】:

    标签: mysql sql-server oracle hibernate jpa


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-12-26
      • 2012-01-31
      • 2012-04-25
      • 2010-11-09
      • 1970-01-01
      • 1970-01-01
      • 2020-11-09
      • 1970-01-01
      相关资源
      最近更新 更多