Jak skomentowałem, wydawało mi się, że Hibernate domyślnie wybierze przestrzenny dialekt, który będzie pierwszym, jaki znajdzie z dostępnych, iw tym przypadku była to Oracle, pomimo tego, co zostało określone w persistence.xml.
Pierwszym obejściem, które znalazłem, było dodanie adnotacji w encji, że dla GeometryUserType użyłbym dialektu Postgis, jak w:
@TypeDefs({@TypeDef(name="org.hibernatespatial.GeometryUserType",
parameters={@org.hibernate.annotations.Parameter(name="dialect",value="org.hibernatespatial.postgis.PostgisDialect")},
typeClass=org.hibernatespatial.GeometryUserType.class)})
To zmusiłoby Hibernate do użycia Postgis dla tego podmiotu.
Drugie obejście, które zadziałało lepiej dla mnie (muszę to skonfigurować i używać różnych dialektów dla jednej jednostki w zależności od jednostki utrwalania i środowiska) jest użycie pliku mapowania w jednostce utrwalania.
<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>
W moim pliku pom zrobię ten plik mapowania do tego, którego potrzebuję, używając profili i zmiennych Mavena.
<hibernate.mappingfile>oracle.hbm.xml</hibernate.mappingfile>
Lub :
<hibernate.mappingfile>postgis.hbm.xml</hibernate.mappingfile>
Więc miałbym na przykład postgis.hbm.xml
plik :
<?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>
Oraz 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>
Zastanawiam się, czy jest lepszy sposób na zrobienie tego, ale żaden nie mógłbym znaleźć w tych dniach lub że otrzymałem tutaj odpowiedź. Mam nadzieję, że to komuś pomoże.