【问题标题】:Hibernate postgresql/hsqldb TEXT column incompatibility problemHibernate postgresql/hsqldb TEXT 列不兼容问题
【发布时间】:2011-05-11 22:58:16
【问题描述】:

我在使用 Hibernate 和 PostgreSQL 进行生产以及使用 HSQLDB 进行测试时遇到问题。
我正在使用自上而下的方法让 Hibernate 创建数据库模式。
我也在使用注释; hibernate.cfg.xml 的映射部分只包含
<mapping class="package.subpackage.ClassName" />
Hibernate 在 PostgreSQL 上将字符串变量默认为字符变化 (255),这在某些情况下对我来说是不够的,所以我必须使用
@Column(columnDefinition = "TEXT") 手动重新定义一些列。
但是,TEXT 类型对 HSQLDB 无效,因此无法创建这些表。

谁能帮忙解决这个问题?

【问题讨论】:

  • 您是否也尝试过使用 Postgres 进行测试?如果是,您遇到过什么样的问题?
  • 是的,我也使用 Postgres 进行测试。没问题,只有hsqldb不兼容问题

标签: hibernate postgresql hsqldb


【解决方案1】:

处理此特定问题的最简单方法可能是根本不使用 columnDefinition,而是使用(例如)显式指定列长度

@Column(length=10000)

您也可以将其映射为 @Lob(type = LobType.CLOB)

但我不确定 HSQLDB 是否正确支持它。在 Postgres 中,它应该为您提供 TEXT 类型。

【讨论】:

  • 是的,这是最简单的解决方案,但我更喜欢使用带有postgres兼容模式的HSQLDB。
【解决方案2】:

同意@fredt。 TEXT 数据类型不是标准的 SQL 类型,而是某些引擎支持的扩展。

要启用 PostgreSQL 兼容模式,请在您的连接参数中使用 sql.syntax_pgs=true

【讨论】:

    【解决方案3】:

    HSQLDB 2.1 及更高版本具有 PostgreSQL 兼容模式,并支持该模式下的 TEXT 数据类型。

    【讨论】:

      【解决方案4】:

      让 H2 在与 PostgreSQL 兼容的模式下工作(对 junit 测试很有用)。

      # JDBC Driver
      jdbc.driverClassName=org.h2.Driver
      jdbc.url=jdbc:h2:mem:play;MODE=PostgreSQL;TRACE_LEVEL_SYSTEM_OUT=2;DB_CLOSE_DELAY=-1;IGNORECASE=TRUE;INIT=CREATE TABLE IF NOT EXISTS PG_CLASS (RELNAME text, RELKIND text);
      jdbc.username=sa
      jdbc.password=
      
      # general hibernate options
      hibernate.database=h2
      hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect
      

      需要创建表 PG_CLASS 才能让 Hibernate/JPA 正常运行。但除此之外 - 非常无缝。

      【讨论】:

        【解决方案5】:

        是的,只需尝试一下,让 HSQLDB 在 PostgreSQL 兼容模式下运行。

        jdbc.url=jdbc:h2:mem:mydb;sql.syntax_pgs=true
        

        【讨论】:

        • 这对我不起作用,但一个独立的财产sql.syntax_pgs=true 确实有效(spring boot jpa)
        【解决方案6】:

        是的,你有一个非常大的问题。

        不要将一个数据库引擎用于测试,而将另一个用于生产。

        您可以解决您从未梦想过的问题。

        【讨论】:

        • 是的,thanx,我想到了这一点,并且我已经组织了测试,因此它们可以轻松地在两个数据库上运行。但是最近我做了一点小改动,hsqldb 开始出问题了。
        • 是和否。同意测试环境应该与生产环境完全一样。但单元测试有所不同:使用内存数据库(如 Apache Derby 或 HSQLDB)非常好。更重要的是:有很多优点。
        • 考虑到您必须在许多环境中部署工件的项目类型,此评论可能是使用多个数据库引擎进行测试和生产的最佳论据。
        • 理想情况下,内部集成测试(组件测试)和生产使用相同的数据库,但最终决定取决于许多因素。集成测试的目的是检查组件和层之间的集成。此外,测试必须快速,以免影响集成周期,它必须能够快速提出上下文。因此,虽然 H2 与 postgre 不完全兼容,但使用 H2 补偿并允许我们验证我们开发的稳健性和组件的集成。
        • 另一方面,如果我们使用hibernate,那就是我们尽可能不知道所使用的数据库类型。在这种情况下,不仅可以在测试和生产中使用不同类型的 db,而且还建议这样做。
        猜你喜欢
        • 2018-10-15
        • 2011-06-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-08-16
        • 2012-10-20
        • 2016-03-07
        • 2013-05-14
        相关资源
        最近更新 更多