Postgis and javax.persistence / JPA

View: New views
1 Messages — Rating Filter:   Alert me  

Postgis and javax.persistence / JPA

by Eduard Witteveen-6 :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

Hello list,

I currently have a database, which has postgis extensions and data. I really would like to use JPA to offer me a abstractionlayer to the database. Can someone give me help me with this or give me some pointers how i can achieve this?

I included my code underneath.

For this i started with the table project:
CREATE TABLE project
(
  projectid serial PRIMARY KEY,
  filter text NOT NULL,
  projectname text NOT NULL
);
SELECT AddGeometryColumn('project', 'extent', 4326, 'POLYGON', 2);
CREATE INDEX idx_project_extent ON project USING gist (extent);
 
I started a new JPA project in eclipse and added the following jars:
- postgis-driver-1.0.jar
- postgis-jdbc-1.1.6.jar
- postgis-jdbc-jts-1.1.6.jar
- postgresql-8.40701.jar

I created a pojo-class which will be my interface to a record:
(Notice that i use PGgeometry instead of Polygon internally: http://www.bastian-voigt.de/2009/01/31/using-postgis-geometry-objects-with-toplink-and-eclipselink/ )

import javax.persistence.*;
import org.postgis.PGgeometry;
import org.postgis.Polygon;
import java.io.Serializable;

@Entity  
@Table(name="PROJECT")
public class Project implements Serializable {   
    private static final long serialVersionUID = -3237770608972654083L;
    public Project() {       
    };
    public Project(long projectID) {
        this.projectID = projectID;
    };   
    @Id
    @Column(name="PROJECTID")
    protected long projectID;
    public long getProjectID() {
        return projectID;
    }
    public void setProjectID(long projectID) {
        this.projectID = projectID;
    }
    @Column(name="PROJECTNAME")
    protected String projectName;
    public String getProjectName() {
        return projectName;
    }
    public void setProjectName(String projectName) {
        this.projectName = projectName;
    }
    @Column(name="FILTER")
    protected String filter;
    public String getFilter() {
        return filter;
    }
    public void setFilter(String filter) {
        this.filter = filter;
    }
    @Column(name="EXTENT")
    protected PGgeometry extent;
    public Polygon getExtent() {
        if(extent == null) {
            return null;
        }
        return (Polygon) extent.getGeometry();
    }
    public void setExtent(Polygon extent) {
        this.extent = new PGgeometry(extent);
    }
}

Added PostGISCustomizer:
import Project;
import org.eclipse.persistence.config.SessionCustomizer;
import org.eclipse.persistence.descriptors.RelationalDescriptor;
import org.eclipse.persistence.mappings.DirectToFieldMapping;
import org.eclipse.persistence.sessions.Session;

public class PostGISCustomizer implements SessionCustomizer {
    public void customize(Session s) throws Exception
    {
        RelationalDescriptor desc;
        DirectToFieldMapping mapping;
 
        desc = (RelationalDescriptor) s.getDescriptor(Project.class);
        mapping = (DirectToFieldMapping) desc.getMappingForAttributeName("extent");
        mapping.setConverter(null);
    }
}

 
Define everything in the persistence.xml:
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="1.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_1_0.xsd">
    <persistence-unit name="ProjectService" transaction-type="RESOURCE_LOCAL">
        <class>Project</class>
        <properties>
            <!--  database connection -->       
            <property name="eclipselink.jdbc.driver" value="org.postgresql.Driver"/>
            <property name="eclipselink.jdbc.url" value="jdbc:postgresql://localhost:5432/postgis"/>
            <property name="eclipselink.jdbc.user" value="postgres"/>
            <property name="eclipselink.jdbc.password" value="postgres"/>
            <!--  customizer  -->
            <!--   <property name="eclipselink.session.customizer" value="PostGISCustomizer"/> -->           
        </properties>       
    </persistence-unit>
</persistence>

When i test the code:

import javax.persistence.*;
import org.postgis.LinearRing;
import org.postgis.Point;
import org.postgis.Polygon;

import java.sql.SQLException;
import java.util.Collection;
public class ProjectTest {
public static void main(String[] args) throws SQLException {
        EntityManagerFactory emf = Persistence.createEntityManagerFactory("ProjectService");
        EntityManager em = emf.createEntityManager();
        // create and persist an project
        em.getTransaction().begin();        
        Project project = new Project();
        project.setProjectName("projectname");
        project.setFilter("filter");
        LinearRing[] rings = new LinearRing[1];
        Point[] points = new Point[2];
        points[0] = new Point(1,1);
        points[1] = new Point(-1, -1);
        rings[0] = new LinearRing(points);
        project.setExtent(new Polygon(rings));
        em.persist(project);
        em.getTransaction().commit();
        em.close();
        emf.close();
    }
}
 
This will fail on runtime with the database error:
[EL Info]: 2009-10-21 14:29:35.046--ServerSession(3200426)--EclipseLink, version: Eclipse Persistence Services - 1.1.2.v20090612-r4475
[EL Info]: 2009-10-21 14:29:35.375--ServerSession(3200426)--file:/.../build/classes/-ProjectService login successful
[EL Warning]: 2009-10-21 14:29:42.234--UnitOfWork(9956648)--Exception [EclipseLink-4002] (Eclipse Persistence Services - 1.1.2.v20090612-r4475): org.eclipse.persistence.exceptions.DatabaseException
Internal Exception: org.postgresql.util.PSQLException: Unknown type null.
Error Code: 0
Call: INSERT INTO PROJECT (PROJECTID, EXTENT, PROJECTNAME, FILTER) VALUES (?, ?, ?, ?)
    bind => [0, POLYGON ((1.0 1.0,-1.0 -1.0)), projectname, filter]
Query: InsertObjectQuery(Project@19ac2e3)

Eduard Witteveen
 

_______________________________________________
postgis-users mailing list
postgis-users@...
http://postgis.refractions.net/mailman/listinfo/postgis-users