PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Não encontrando o Oracle Connection quando uma conexão PostGIS é definida


Conforme comentado, pareceu-me que o Hibernate irá padronizar para um espacialDialect que será o primeiro que encontrar entre os disponíveis, e nesse caso foi o Oracle, apesar do que foi especificado no persistence.xml.

A primeira solução que encontrei foi anotar na entidade que para o GeometryUserType eu usaria o dialeto Postgis como em:
@TypeDefs({@TypeDef(name="org.hibernatespatial.GeometryUserType", 
        parameters={@org.hibernate.annotations.Parameter(name="dialect",value="org.hibernatespatial.postgis.PostgisDialect")},
        typeClass=org.hibernatespatial.GeometryUserType.class)})

Isso forçaria o Hibernate a usar o Postgis para essa entidade.

A segunda solução, que funcionou melhor para mim (preciso configurar isso e usar dialetos diferentes para uma entidade, dependendo da unidade de persistência e do ambiente) é usar um arquivo de mapeamento na unidade de persistência.
<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>

No meu arquivo pom, farei esse arquivo de mapeamento para o que preciso, usando perfis e variáveis ​​do Maven.
<hibernate.mappingfile>oracle.hbm.xml</hibernate.mappingfile>

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

Então eu teria por exemplo um postgis.hbm.xml Arquivo :
<?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 um 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>

Gostaria de saber se existe uma maneira melhor de fazer isso, mas nenhuma que eu consegui encontrar durante esses dias, ou que me tenham respondido aqui. Espero que isso ajude a alguém.