1

我是 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 类型,但没有运气。如果有人可以帮助我或将我指向在线网站,以便我可以阅读更多内容,那将是一个很大的帮助!感谢您的阅读!

4

2 回答 2

4

jsonPostgreSQL 对,xml等类似文本的类型之间的隐式转换非常严格。

严格正确的解决方案是在使用setObject(the_string, java.sql.Types.SQLXML)JDBC 设置参数时使用。通过 ORM 层很难做到这一点,而且许多 ORM 似乎并不直接理解 SQL/XML 类型。

您可以通过修改系统目录来告诉 PostgreSQL 允许隐式转换 from textto 。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';

弄乱系统目录可能会产生意想不到的影响。在这种情况下,我相信进行此更改是相当安全的,但它仍然会弄乱系统的内部结构。继续需要您自担风险。

于 2013-06-26T02:08:26.513 回答
1

您可能会使用 Converter 在 String 和 Postgres XML 类型之间进行转换。

否则,您可以扩展 PostgreSQLPlatform 以支持该类型。(请参阅 DatabasePlatform.setParameterValueInDatabaseCall()、DatabasePlatform.getCustomModifyValueForCall() 和 DatabasePlatform.shouldUseCustomModifyForCall())。

如果你不能让它工作,我建议你也记录一个错误。应该有一个简单的方法来做到这一点。

于 2013-06-26T13:44:59.093 回答