使用 EclipseLink JPA 将 XML 类型存储到 PostgreSQL
Posted
技术标签:
【中文标题】使用 EclipseLink JPA 将 XML 类型存储到 PostgreSQL【英文标题】:Using EclipseLink JPA to store XML type to PostgreSQL 【发布时间】:2013-06-26 01:37:44 【问题描述】:我是 JPA 的新手,我有一个关于如何使用 JPA 将 XML 类型存储到 PostgreSQL 的问题。我只是扩展现有的 POJO 以包括将附加的 XML 字段持久化到列中。 POJO 看起来像这样(我故意省略了一堆其他列以使其更短,在添加这个额外的 XML 类型之前,这个 POJO 可以通过 JPA 很好地保存到 PostgreSQL 中)。
public class Finding implements Serializable
private static final long serialVersionUID = -5814053129578212916L;
...
@Column(name = "PLUGIN_TEXT_XML")
private String pluginTextXML;
public void setPluginText(String pluginText)
this.pluginText = pluginText;
public String getPluginTextXML()
return pluginTextXML;
当我尝试持久化这个 POJO 时,我收到了 PSQLException
Caused by: org.postgresql.util.PSQLException: ERROR: column "plugin_text_xml" is of type xml but expression is of type character varying
Hint: You will need to rewrite or cast the expression.
Position: 668
我一直在尝试在线查看如何在 JPA 中映射 XML 类型,但没有运气。如果有人可以帮助我或将我指向在线网站,以便我可以阅读更多内容,那将是一个很大的帮助!感谢您的阅读!
【问题讨论】:
【参考方案1】:PostgreSQL 对 json
、xml
等类似文本的类型之间的隐式转换非常严格。
严格正确的解决方案是使用 JDBC 设置参数时使用setObject(the_string, java.sql.Types.SQLXML)
。通过 ORM 层很难做到这一点,而且许多 ORM 似乎并不直接理解 SQL/XML 类型。
您可以通过修改系统目录来告诉 PostgreSQL 允许从text
到xml
的转换是隐式的。这并不理想,但它会起作用。
在psql
中,您可以使用\dC xml
将猫列为xml
:
List of casts
Source type | Target type | Function | Implicit?
-------------------+-------------------+--------------------+---------------
character | xml | xml | no
character varying | xml | xml | no
text | xml | xml | no
xml | character | (binary coercible) | in assignment
xml | character varying | (binary coercible) | in assignment
xml | text | (binary coercible) | in assignment
(6 rows)
看到“隐式:否”了吗?
您需要使它们可以赋值转换。由于它们是内置类型,因此您不能为它们使用 CREATE CAST
,因此您必须直接更新目录,更改 pg_cast
表。
UPDATE pg_cast SET castcontext = 'a'
FROM pg_cast c
INNER JOIN pg_type srctype ON (c.castsource = srctype.oid)
INNER JOIN pg_type dsttype on (c.casttarget = dsttype.oid)
WHERE pg_cast.oid = c.oid
AND srctype.typname IN ('text','varchar')
AND dsttype.typname = 'xml';
弄乱系统目录可能会产生意想不到的影响。在这种情况下,我认为进行此更改是相当安全的,但它仍然会弄乱系统的内部结构。风险自负。
【讨论】:
【参考方案2】:您可能会使用 Converter 在 String 和 Postgres XML 类型之间进行转换。
否则,您可以扩展 PostgreSQLPlatform 以支持该类型。 (请参阅 DatabasePlatform.setParameterValueInDatabaseCall()、DatabasePlatform.getCustomModifyValueForCall() 和 DatabasePlatform.shouldUseCustomModifyForCall())。
如果你不能让它工作,我建议你也记录一个错误。应该有一个简单的方法来做到这一点。
【讨论】:
嗨,詹姆斯,感谢您的回复。这是您指的转换器方法吗? ***.com/questions/3961237/…我刚试了一下,还是一样的异常。 其实可以用JPA转换器转Postgres JDBC的PGobject ***.com/a/26126168/1535995以上是关于使用 EclipseLink JPA 将 XML 类型存储到 PostgreSQL的主要内容,如果未能解决你的问题,请参考以下文章
使用JPA + Eclipselink操作PostgreSQL数据库
依赖于EclipseLink与org.eclipse.persistence.jpa的相关性
JPA + EclipseLink+ HSQLDB 不创建表
使用 JPA 2.1、EclipseLink、JSF 2.0 的日志表