带有 h2 嵌入式数据库的 MySQL LONGTEXT

Posted

技术标签:

【中文标题】带有 h2 嵌入式数据库的 MySQL LONGTEXT【英文标题】:MySQL LONGTEXT with h2 embedded database 【发布时间】:2015-05-20 11:31:24 【问题描述】:

我正在尝试让我的应用程序在 mysql(用于生产)和 H2(用于开发/测试)上运行。我创建表的(Flyway)脚本现在几乎相同,除了需要为 MySQL 声明“LONGTEXT”的列。如果我也将它用于 H2(在 MySQL 兼容模式下运行),我得到:

Wrong column type in public.public.customer_license for column license.
Found: clob, expected: varchar(65535)

我的实体的 Java 代码:

@Column(name = "license", length = 65535)
private String m_license;

如果我将列声明更改为 VARCHAR(65535),那么它适用于 H2,但不适用于 MySQL:

com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Column length too big for column 'license' 
(max = 21845); use BLOB or TEXT instead

我怎样才能使它对两者都适用?

【问题讨论】:

BLOB 数据类型也可用于 H2。您可以在 H2 和 MySQL 中使用它。这里是h2database.com/html/datatypes.html#blob_type MySQL 似乎不喜欢它。我得到Wrong column type in flux_licenses.customer_license for column license. Found: blob, expected: longtext 我在我的项目中支持了 3 个数据库,但是这三个数据库都有不同的类和不同的方法。我用的是 BLOB 而不是 LONGTEXT 【参考方案1】:

我遇到了同样的问题。我通过使用@Lob 注解解决了这个问题。这通过 mysql 表中的LONGTEXT 验证正常。当使用内存中的 H2 时,会创建一个 CLOB 字段。

import javax.persistence.Lob;

...

@Lob
private String lotsOfText;

【讨论】:

【参考方案2】:

这就是存在orm.xml 的原因之一,因此您可以为一个数据存储区设置一个映射,为另一个数据存储区设置一个映射,因此无需在运行之间重新编译代码

【讨论】:

我正在使用 Spring Boot,我没有 orm.xml。您是否有指向更多文档的链接,以了解如何执行您在此处所说的操作? orm.xml 是 JPA 标准的一部分。您可以通过 persistence.xml 的映射文件部分指定位置。另见datanucleus.org/products/accessplatform_4_1/jpa/… @WimDeblauwe:以 SO 为例,参见this post

以上是关于带有 h2 嵌入式数据库的 MySQL LONGTEXT的主要内容,如果未能解决你的问题,请参考以下文章

如何最好地处理带有嵌入式数据库的 Flyway 以进行集成测试?

H2 嵌入式数据库在部署时丢失表/数据

java - 如何在java桌面应用程序中使用spring(事务)和hibernate创建嵌入式H2 DB?

H2数据库

如何使用嵌入式数据库 H2 创建 jar 文件?

Spring Boot DataJpaTest 单元测试恢复到 H2 而不是 mySql