简体   繁体   English

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

[英]JPA Hibernate - Multiple Database Dialects and nvarchar(length) data type

I have to do a project using JPA + Hibernate in which I'm using 3 dialects: MySQL5InnoDBDialect, MSSQL2012Dialect and Oracle12cDialect.我必须使用 JPA + Hibernate 做一个项目,其中我使用 3 种方言:MySQL5InnoDBDialect、MSSQL2012Dialect 和 Oracle12cDialect。

Right now I have a specification which is telling me that for some column from:现在,我有一个规范告诉我,对于来自以下的某些列:

  • Oracle database, I have to use NVARCHAR2(LENGTH) data type Oracle 数据库,我必须使用 NVARCHAR2(LENGTH) 数据类型

  • MySql database, I have to use VARCHAR(LENGTH) data type MySql 数据库,我必须使用 VARCHAR(LENGTH) 数据类型

  • MSSQL database, I have to use NVARCHAR(LENGTH) data type MSSQL 数据库,我必须使用 NVARCHAR(LENGTH) 数据类型

... and here is my problem.. ...这是我的问题..

  1. If I use:如果我使用:

    @Column(name="columnName" length = 255) private String columnName; @Column(name="columnName" 长度 = 255) 私有字符串列名; hibernate generates varchar(255) and this is good just for MySQL hibernate 生成 varchar(255) 这对 MySQL 来说很好

  2. If I use:如果我使用:

    @Column(name="columnName", columnDefinition="nvarchar2(255)") private String columnName; @Column(name="columnName", columnDefinition="nvarchar2(255)") 私有字符串 columnName; it's not possible in MySQL, i get error because of columnDefinition, but in oracle is okay这在 MySQL 中是不可能的,由于 columnDefinition 我得到错误,但在 oracle 中是可以的

  3. I tried to customize MySQL dialect creating我尝试自定义 MySQL 方言创建

    public class CustomMySQL5InnoDBDialect extends MySQL5InnoDBDialect{公共类 CustomMySQL5InnoDBDialect 扩展 MySQL5InnoDBDialect{

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

    } }

and giving this class in hibernate configuration for MySQL dialect.并在休眠配置中为 MySQL 方言提供此类。 I have the same problem in MySQL if I'm using columnDefinition property.如果我使用 columnDefinition 属性,我在 MySQL 中会遇到同样的问题。

Can you help with this problem please?你能帮忙解决这个问题吗?

The solution is to make use of the feature that the JPA API spec provides you with for just this situation.解决方案是利用 JPA API 规范针对这种情况提供的特性。 Define a file orm.xml for each datastore that you need to support, and enable the requisite one when using each database.为您需要支持的每个数据存储定义一个文件orm.xml ,并在使用每个数据库时启用必要的文件。 See this link for details of the file format.有关文件格式的详细信息,请参阅此链接 That way you don't need to think about hacking the internal features of whichever JPA provider you are using, and you also retain JPA provider portability, as well as database portability这样您就无需考虑破解您正在使用的任何 JPA 提供程序的内部功能,并且您还保留了 JPA 提供程序的可移植性以及数据库的可移植性

The idea of putting schema specific information info (static) Java annotations is an odd one, even more so when wanting database portability.放置特定于模式的信息信息(静态)Java 注释的想法很奇怪,在需要数据库可移植性时更是如此。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM