2010-11-18 71 views
9

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

任何人都可以帮助解决这个问题吗?Hibernate postgresql/hsqldb TEXT列不兼容问题

+0

您是否尝试过使用Postgres进行测试呢?如果是,你遇到了什么样的问题? – 2010-11-18 11:49:39

+0

是的,我也使用Postgres进行测试。没有问题,只有hsqldb不兼容问题 – Nemanja 2010-11-19 10:49:20

回答

10

处理这个具体问题的最简单的方法可能是在所有不使用columnDefinition,而是明确地与指定列长度(例如)

@Column(length=10000) 

这也可能是你能代替与 @Lob(type = LobType.CLOB)

但我不确定在HSQLDB中正确支持。在Postgres中它应该给你你的TEXT类型。

+0

是啊,thanx,长度是诀窍! – Nemanja 2010-11-18 13:30:21

+1

是的,这是最简单的解决方案,但我更喜欢使用HSQLDB和Postgres兼容模式。 – 2012-10-25 11:28:08

-5

是的,你有一个真的很大问题。

不要使用一个数据库引擎进行测试,另一个用于生产。

你可以遇到你从未梦想过的问题。

+0

是的,thanx,我记住了这一点,并组织了测试,以便它们可以轻松地在两个数据库上运行。但最近我有了这个小小的变化,hsqldb开始出现问题。 – Nemanja 2010-11-19 10:46:58

+19

是和否。同意测试环境**应与生产环境完全相同。但是单元测试是不同的:使用内存数据库(如Apache Derby或HSQLDB)非常好。更重要的是:有很多优点。 – 2012-10-25 11:09:40

+0

考虑到您必须在许多环境中部署工件的项目类型,此评论可能是使用多个数据库引擎进行测试和生产的最佳参数。 – 2014-06-25 15:39:13

6

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

8

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

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

2

让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正常工作。但除此之外 - 非常无缝。