【问题标题】:MySQL LONGTEXT with h2 embedded database带有 h2 嵌入式数据库的 MySQL LONGTEXT
【发布时间】: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

标签: java mysql jpa h2


【解决方案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
    猜你喜欢
    • 2017-03-05
    • 2016-01-22
    • 2023-03-19
    • 2022-01-20
    • 2012-10-22
    • 2018-06-13
    • 2017-10-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多