在 OpenJPA 中使用 inet postgres 数据类型

Posted

技术标签:

【中文标题】在 OpenJPA 中使用 inet postgres 数据类型【英文标题】:Using inet postgres datatype with OpenJPA 【发布时间】:2015-01-12 16:52:40 【问题描述】:

我的应用程序正在使用 OpenJPA 连接 Postgres 数据库。在架构中,我在列中使用 inet postgres 数据类型。 Java 中的这个字段是一个字符串。我能够正确读取该字段,但在插入新行时遇到问题。

在互联网上搜索我发现了三种可能的解决方案:

    创建本机查询。此方法有效,但在我的特定情况下,创建本机查询以插入此行意味着创建更多由 OpenJPA 管理的查询,这可能会导致大量错误。所以在这种情况下它不是更合适的解决方案。

    像这个问题一样创建 PostgresDictionary:How to use Postgres inet data type with OpenJPA?。我已经实现了这个用户解释的方式。我创建了自定义 PostgresDictionary,在 @Column 注释中添加了 columnDefinition,并在 persistence.xml 中添加了属性。但是我的自定义 PostgresDictionary 永远不会被调用。 当应用程序创建 PostgresDictionary 时,会继续创建 org.apache.openjpa.jdbc.sql.PostgresDictionary 而不是自定义的。

    实现自定义策略,如示例http://webspherepersistence.blogspot.co.at/2009/04/custom-orm-with-openjpa.html。但是为了实现策略,我必须从类 java.sql.Types (http://docs.oracle.com/javase/6/docs/api/java/sql/Types.html?is-external=true) 中设置列​​的类型,并且该列中没有 inet 类型。我尝试了 Types.OTHER,但我仍然有相同的错误,表明该列是 inet 类型并且我尝试插入的值是 varchar (String)。

那么,有人知道如何解决我在映射方面遇到的问题吗?

【问题讨论】:

【参考方案1】:

第 2 点中的解决方案不起作用,因为 openjpa.jdbc.DBDictionary 已被数据库属性设置为 POSTGRESQL 的类 org.springframework.orm.jpa.vendor.OpenJpaVendorAdapter 覆盖。这显然将 DBDictionary 设置为 org.apache.openjpa.jdbc.sql.PostgresDictionary 独立于 persistence.xml 属性中设置的值。

从 OpenJpaVendorAdapter 中删除此数据库属性允许我使用我的自定义 PostgresDictionary。

【讨论】:

以上是关于在 OpenJPA 中使用 inet postgres 数据类型的主要内容,如果未能解决你的问题,请参考以下文章

H2 - Postgres 模式支持网络数据类型

带有嵌套 SQL 查询或如何查找最后一个 INET 的 Postgres 视图

OpenJPA/MySQL:在 where 子句中使用同一张表时修改表

OpenJPA:JPQL 与本机查询

OpenJPA - 实例的 id 字段在查询时返回 null

如何确定 OpenJPA 中 FetchBatchSize 的数量?