sql >> Base de Datos >  >> RDS >> PostgreSQL

No encontrar Oracle Connection cuando se define una conexión PostGIS

Como se comentó, me pareció que Hibernate usará de manera predeterminada un dialecto espacial que será el primero que encuentre entre los disponibles, y en ese caso fue Oracle, a pesar de lo que se especificó en el archivo persistence.xml.

La primera solución que encontré fue anotar en la entidad que para GeometryUserType usaría el dialecto de Postgis como en:

@TypeDefs({@TypeDef(name="org.hibernatespatial.GeometryUserType", 
        parameters={@org.hibernate.annotations.Parameter(name="dialect",value="org.hibernatespatial.postgis.PostgisDialect")},
        typeClass=org.hibernatespatial.GeometryUserType.class)})

Eso obligaría a Hibernate a usar Postgis para esa entidad.

La segunda solución, que funcionó mejor para mí (necesito poder configurar esto y usar diferentes dialectos para una entidad según la unidad de persistencia y el entorno) es usar un archivo de mapeo en la unidad de persistencia.

<persistence-unit name="persistence_unit_name" transaction-type="JTA">
    <provider>org.hibernate.ejb.HibernatePersistence</provider>
    <jta-data-source>jta_data_source_name</jta-data-source>
    <mapping-file>${hibernate.mappingfile}</mapping-file>
    <class>(...)</class>

En mi archivo pom, haré ese archivo de mapeo al que necesito, usando perfiles y variables de Maven.

<hibernate.mappingfile>oracle.hbm.xml</hibernate.mappingfile>

O:

<hibernate.mappingfile>postgis.hbm.xml</hibernate.mappingfile>

Entonces tendría, por ejemplo, un postgis.hbm.xml archivo:

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC 
 "-//Hibernate/Hibernate Mapping DTD//EN"
 "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> 
<hibernate-mapping>
    <typedef name="org.hibernatespatial.GeometryUserType" class="org.hibernatespatial.GeometryUserType" >
        <param name="dialect">org.hibernatespatial.postgis.PostgisDialect</param>
    </typedef>
</hibernate-mapping>

Y un oracle.hbm.xml :

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC 
 "-//Hibernate/Hibernate Mapping DTD//EN"
 "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> 
<hibernate-mapping>
    <typedef name="org.hibernatespatial.GeometryUserType" class="org.hibernatespatial.GeometryUserType" >
        <param name="dialect">org.hibernatespatial.oracle.OracleSpatial10gDialect</param>
    </typedef>
</hibernate-mapping>

Me pregunto si hay una mejor manera de hacer esto, pero ninguna que pude encontrar durante estos días, o que me respondieron aquí. Espero que esto ayude a alguien.