JPA - 将实体的字段映射到数据库函数结果

时间:2014-04-24 19:09:07

标签: java postgresql jpa eclipselink postgis

我使用的是JPA 2.0。是否可以将实体的属性(列)映射到函数的结果,然后控制它的持续方式?

注意:这与PostGIS有关。由于JPA / EclipseLink中没有对Geometry类型的原生支持,我可能会这样做:

@Entity
public class Foo {

   @Column(name="geom", appendBeforeChange( ST_FromKml ))
   public String kmlString;
}

换句话说,我可以将几何体作为String存储在Java中,但是当EclipseLink将它写入数据库时​​,它应首先调用数据库函数ST_FromKml并提供String,它将把它转换为Geometry类型。数据库...

我知道这是一段时间,但我想我会问......

1 个答案:

答案 0 :(得分:2)

我实际上在这篇帖子的帮助下找到了一个解决方法:

Are JPA (EclipseLink) custom types possible?

在Postgres中,我创建了一个从String到Geometry的隐式转换:

CREATE OR REPLACE FUNCTION geom_in_text(varchar) RETURNS geometry AS $$
  SELECT ST_GeomFromText($1::varchar); 
$$ LANGUAGE SQL IMMUTABLE;

CREATE CAST (varchar AS geometry) WITH FUNCTION geom_in_text(varchar) AS IMPLICIT;

现在在Java中,我只是将我的Entity成员变量保存为WKT格式的String。当Postgres看到INSERT时,它会识别可用的隐式演员而不是抱怨。

注意 - 我将WKT存储在我的Entity类中,但理论上我可以存储KML然后更新我的函数来调用ST_GeomFromKml而不是......