PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Impossible de trouver Oracle Connection lorsqu'une connexion PostGIS est définie

Comme commenté, il m'a semblé qu'Hibernate utiliserait par défaut un spatialDialect qui sera le premier qu'il trouvera parmi les disponibles, et dans ce cas, c'était Oracle, malgré tout ce qui était spécifié dans le persistence.xml.

La première solution de contournement que j'ai trouvée a été d'annoter dans l'entité que pour le GeometryUserType j'utiliserais le dialecte Postgis comme dans :

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

Cela forcerait Hibernate à utiliser Postgis pour cette entité.

La deuxième solution de contournement, qui a mieux fonctionné pour moi (je dois pouvoir configurer cela et utiliser différents dialectes pour une entité en fonction de l'unité de persistance et de l'environnement) consiste à utiliser un fichier de mappage dans l'unité de persistance.

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

Dans mon fichier pom, je créerai ce fichier de mappage avec celui dont j'ai besoin, en utilisant des profils et des variables Maven.

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

Ou :

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

J'aurais donc par exemple un postgis.hbm.xml fichier :

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

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

Je me demande s'il existe une meilleure façon de le faire, mais aucune que j'ai pu trouver ces jours-ci, ou à laquelle on m'a répondu ici. J'espère que cela aidera quelqu'un.