JPA(Hibernate)Map String to postgres XML数据类型

时间:2014-09-09 07:28:24

标签: hibernate postgresql wildfly

我正在尝试使用以下设置: Wildfly 8.1.0(Hibernate自带JPA实现) Postgres 9.3数据库

我想将一个Java String映射到postgres的xml-type列,但我得到的错误是该列的类型为“xml”,而表达式的类型为varchar。

我发现大多数(可能)解决方案都是数据库特定的java类,hibernate特定的解决方法或者只是在Stackoverflow上没有答案的问题。

我想使用已定义的JPA-Methods能够随意切换到Mysql或SQLServer,甚至可以用glassfish或tomcat + openJPA替换Widlfly + hibernate,而无需触及代码。

然而,在数据库中调整一些东西会很好。

我当然已经做了一些研究并找到了这篇文章: http://www.pateldenish.com/2013/05/inserting-json-data-into-postgres-using-jdbc-driver.html

所以我尝试为text和varchar添加隐式转换:

create cast (varchar as xml) without function as implicit;
create cast (text as xml) without function as implicit;

但是postgres只是说这些演员阵容已经存在。我通过将随机字符串插入到xml列中来验证这一点,该列工作正常。

异常仍然存在。

提前感谢提示和指示,

BillDoor

更新:

我使用postgres 9.3.1102.jdbc41

语句hibernate问题:

[PreparedStatement] setLong(3, 20)
[PreparedStatement] setNull(2, -3)
[PreparedStatement] setNull(1, 12)
[Connection] prepareStatement(insert into testTable (xml, stuff, id) values (?, ?, ?))

fyi:stuff和xml可以为空,ID是primaryKey,20是从序列中正确检索的。

1 个答案:

答案 0 :(得分:4)

在最近讨论过pgsql-hackers之后,我发现有一个更简单的方法可以解决这个问题。在JDBC URL中,或在连接时传递给驱动程序的属性映射中,添加:

stringtype=unspecified

这将导致PgJDBC将setString(...)分配的值unknown类型报告给PostgreSQL,然后将推断出由于目标字段为xml,应该处理该字符串属于xml类型。