異なる Hibernate 永続ユニット用に Postgis と Oracle 空間を構成した後、 persistence.xmlとそのマッピング ファイルで構成されているように、MyClass のインスタンスを Postgis または Oracle データベースに永続化します。
geom属性に注釈を付けます。
public abstract class MyClass (...)
@Type(type = "org.hibernatespatial.GeometryUserType")
@Column(name = "geom", columnDefinition="Geometry", nullable = true)
protected Geometry geom; (...)
Persistence.xml の構成:
<persistence-unit name="pers_unit_name" transaction-type="JTA">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<jta-data-source>jta_data_source_name</jta-data-source>
<mapping-file>oracle.hbm.xml</mapping-file>
そして私のoracle.hbm.xmlで:
<hibernate-mapping>
<typedef name="org.hibernatespatial.GeometryUserType" class="org.hibernatespatial.GeometryUserType" >
<param name="dialect">org.hibernatespatial.oracle.OracleSpatial10gDialect</param>
</typedef>
</hibernate-mapping>
Postgis の設定も同様に機能します。
そのため、MyClass エンティティをクエリすると、正しい方言が選択されます。データベースに情報を挿入または取得するときに、それが機能し、その属性に適した方言を選択するようです(単純なquery.list())。
しかし、そのタイプのパラメーターを使用してその属性をフィルタリングしている場合:
String queryString = "SELECT NEW map(m.id, m.geom)" +
"FROM MyClass m " +
"WHERE within (r.geom, :geometry) = true ";
final org.hibernate.Query query = session.createQuery(queryString);
query.setParameter("geometry", geom, GeometryUserType.TYPE);
return query.list();
永続化ユニットに指定されたものではなく、その特定のパラメーターにデフォルトで構成された Hibernate ダイアレクトを使用するため、以下のスタックトレースが出力されます。
デフォルトで構成されているものの代わりに、述語の特定のパラメーター フィールドの永続性ユニットで定義したように、一貫した方言を強制的に使用する方法はありますか?
Caused by: java.sql.SQLException: Invalid column type
at oracle.jdbc.driver.OraclePreparedStatement.setObjectCritical(OraclePreparedStatement.java:8921)
at oracle.jdbc.driver.OraclePreparedStatement.setObjectInternal(OraclePreparedStatement.java:8396)
at oracle.jdbc.driver.OraclePreparedStatement.setObjectInternal(OraclePreparedStatement.java:9176)
at oracle.jdbc.driver.OraclePreparedStatement.setObject(OraclePreparedStatement.java:9153)
at oracle.jdbc.driver.OraclePreparedStatementWrapper.setObject(OraclePreparedStatementWrapper.java:234)
at org.apache.tomcat.dbcp.dbcp2.DelegatingPreparedStatement.setObject(DelegatingPreparedStatement.java:188)
at org.apache.tomcat.dbcp.dbcp2.DelegatingPreparedStatement.setObject(DelegatingPreparedStatement.java:188)
at org.hibernatespatial.AbstractDBGeometryType.nullSafeSet(AbstractDBGeometryType.java:154)
at org.hibernatespatial.GeometryUserType.nullSafeSet(GeometryUserType.java:201)
at org.hibernate.type.CustomType.nullSafeSet(CustomType.java:146)
at org.hibernate.param.NamedParameterSpecification.bind(NamedParameterSpecification.java:67)
at org.hibernate.loader.hql.QueryLoader.bindParameterValues(QueryLoader.java:578)
at org.hibernate.loader.Loader.prepareQueryStatement(Loader.java:1716)
at org.hibernate.loader.Loader.doQuery(Loader.java:801)
at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:274)
at org.hibernate.loader.Loader.doList(Loader.java:2542)