PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Impossibile trovare Oracle Connection quando viene definita una connessione PostGIS

Come commentato, mi è sembrato che Hibernate impostasse per impostazione predefinita uno spazialDialect che sarà il primo che trova tra quelli disponibili, e in quel caso era Oracle, nonostante quanto specificato in persistence.xml.

La prima soluzione che ho trovato è stata quella di annotare nell'entità che per GeometryUserType avrei usato il dialetto Postgis come in :

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

Ciò costringerebbe Hibernate a utilizzare Postgis per quell'entità.

La seconda soluzione, che ha funzionato meglio per me (devo essere in grado di configurarlo e utilizzare dialetti diversi per un'entità a seconda dell'unità di persistenza e dell'ambiente) consiste nell'utilizzare un file di mappatura nell'unità di persistenza.

<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>

Nel mio file pom, creerò quel file di mappatura su quello di cui ho bisogno, usando i profili e le variabili Maven.

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

Oppure :

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

Quindi avrei ad esempio un postgis.hbm.xml file:

<?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>

E 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>

Mi chiedo se c'è un modo migliore per farlo, ma nessuno che sono riuscito a trovare in questi giorni, o che mi è stato risposto qui. Spero che questo aiuti a qualcuno.