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 以及如果我不提供方言属性,为啥我的应用程序正在运行?