コメントしたように、HibernateはデフォルトでspatialDialectに設定されます。これは、persistence.xmlで指定されているものに関係なく、使用可能なものから最初に検出されます。その場合はOracleでした。
私が見つけた最初の回避策は、GeometryUserTypeに対して次のようにPostgis方言を使用することをエンティティに注釈を付けることでした:
@TypeDefs({@TypeDef(name="org.hibernatespatial.GeometryUserType",
parameters={@org.hibernate.annotations.Parameter(name="dialect",value="org.hibernatespatial.postgis.PostgisDialect")},
typeClass=org.hibernatespatial.GeometryUserType.class)})
それはHibernateにそのエンティティにPostgisを使用することを強制します。
私にとってよりうまく機能した2番目の回避策(これを構成し、永続性ユニットと環境に応じて1つのエンティティに異なる方言を使用できる必要があります)は、永続性ユニットでマッピングファイルを使用することです。
<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>
私のpomファイルでは、Mavenプロファイルと変数を使用して、そのマッピングファイルを必要なものに作成します。
<hibernate.mappingfile>oracle.hbm.xml</hibernate.mappingfile>
または:
<hibernate.mappingfile>postgis.hbm.xml</hibernate.mappingfile>
したがって、たとえばpostgis.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.postgis.PostgisDialect</param>
</typedef>
</hibernate-mapping>
そして、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>
これを行うためのより良い方法があるかどうか疑問に思いますが、最近私が見つけることができなかった、または私がここで答えられたということはありません。これが誰かに役立つことを願っています。