带有 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 以进行集成测试?