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 型を直接理解していないようです。

システム カタログを変更することにより、暗黙的に totextからのキャストを許可するように PostgreSQL に指示できます。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)

"implicit: no" を参照してください。

それらを代入変換可能にする必要があります。それらは組み込み型で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 を使用して、文字列と Postgres XML 型の間で変換できる可能性があります。

それ以外の場合は、型をサポートするように PostgreSQLPlatform を拡張できます。(DatabasePlatform.setParameterValueInDatabaseCall()、DatabasePlatform.getCustomModifyValueForCall()、および DatabasePlatform.shouldUseCustomModifyForCall() を参照してください)。

動作しない場合は、バグを記録することもお勧めします。これを行う簡単な方法があるはずです。

于 2013-06-26T13:44:59.093 に答える