2012-06-25 32 views
3

我剛剛添加了一個類型爲Geography的列到Postgres數據庫,該數據庫由應用程序使用hibernate和hibernate spatial訪問。每當我用hibernate訪問該列時,都會出現一條錯誤,提示「無法轉換org.postgresql.util.PGobject類型的對象」。我使用的是較早版本的hibernate spatial,但似乎即使是最新版本也不支持Geography數據類型。這是真的嗎,還是我錯過了什麼?有沒有辦法解決這個限制?Hibernate Spatial和PostGIS的地理類型

回答

0

我有一個類似的問題使用Glassfish 3.1.2 + Toplink。我解決了它實現SessionCustomizer。我相信你可以對地理數據類型使用相同的方法。

PostGISJPACustomizer.java

public class PostGISJPACustomizer implements SessionCustomizer { 

    @Override 
    public void customize(Session s) throws Exception { 
     RelationalDescriptor desc01 = (RelationalDescriptor) s.getDescriptor(SentenceGPS.class); 
     DirectToFieldMapping mapping01 = (DirectToFieldMapping) desc01.getMappingForAttributeName("geom"); 
     mapping01.setConverter(null); 

     RelationalDescriptor desc02 = (RelationalDescriptor) s.getDescriptor(SentenceLine.class); 
     DirectToFieldMapping mapping02 = (DirectToFieldMapping) desc02.getMappingForAttributeName("geom"); 
     mapping02.setConverter(null); 

     RelationalDescriptor desc03 = (RelationalDescriptor) s.getDescriptor(SentencePolygon.class); 
     DirectToFieldMapping mapping03 = (DirectToFieldMapping) desc03.getMappingForAttributeName("geom"); 
     mapping03.setConverter(null); 
    } 
} 

的persistence.xml

<?xml version="1.0" encoding="UTF-8"?> 
<persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"> 
    <persistence-unit name="onet-ejbPU" transaction-type="JTA"> 
    <jta-data-source>jdbc/onet</jta-data-source> 
     <exclude-unlisted-classes>false</exclude-unlisted-classes> 
     <properties> 
      <property name="eclipselink.session.customizer" value="com.util.PostGISJPACustomizer"/> 
     </properties> 
    </persistence-unit> 
</persistence> 

SentenceGPS.java(局部的)

@Entity 
public class SentenceGPS implements Serializable { 

    @Column 
    private PGgeometry geom; 

    public void setGeom(LineString geom) { 
     this.geom = GeoUtils.getPGeo(geom); 
    } 

    public LineString getGeom() { 
     return (LineString) GeoUtils.getJTS(geom); 
    } 
} 

GeoUtils.java

public class GeoUtils { 

    public static PGgeometry getPGeo(Geometry g) throws SQLException { 
     String PGgeometryStr = "SRID=" + g.getSRID() + ";" + g.toString(); 
     PGgeometry pg = new PGgeometry(PGgeometry.geomFromString(PGgeometryStr)); 
     return pg; 
    } 

    // This function needs improvements due peformance issues 
    public static Geometry getJTS(PGgeometry g) throws ParseException, SQLException { 
     WKTReader reader = new WKTReader(new GeometryFactory(new PrecisionModel(PrecisionModel.FLOATING), g.getGeometry().getSrid())); 
     String geometryString = g.getGeometry().toString(); 

     Geometry geom; 
     if (geometryString.indexOf(';') != -1) { 
      String[] temp = PGgeometry.splitSRID(geometryString); 
      int srid = Integer.parseInt(temp[0].substring(5)); 
      geom = (Geometry) reader.read(temp[1]); 
      geom.setSRID(srid); 
     } else { 
      geom = (Geometry) reader.read(geometryString); 
     } 
     return geom; 
    } 
} 
相關問題