问题:JPA(Hibernate) 将字符串映射到 postgres XML 数据类型

我正在尝试使以下设置正常工作:Wildfly 8.1.0(带有 Hibernate 作为 JPA 实现)Postgres 9.3 数据库

我想将 Java 字符串映射到 postgres 的 xml 类型的列,但我得到的错误是该列是“xml”类型,而表达式是 varchar 类型。

我发现的大多数(可能)解决方案都存在于特定于数据库的 java 类、特定于休眠的解决方法或只是在 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 列来验证这一点,效果很好。

异常仍然发生。

提前感谢您的提示和指导,

比尔门

更新:

我使用 postgres 9.3.1102.jdbc41

语句休眠问题:

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

仅供参考: stuff 和 xml 可以为空,ID 是 primaryKey 并且 20 是从序列中正确检索的。

解答

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

stringtype=unspecified

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

Logo

PostgreSQL社区为您提供最前沿的新闻资讯和知识内容

更多推荐