Như đã nhận xét, tôi thấy rằng Hibernate sẽ mặc định là spatialDialect sẽ là spatialDialect đầu tiên mà nó tìm thấy từ cái có sẵn, và trong trường hợp đó là Oracle, mặc dù bất cứ điều gì đã được chỉ định trong Persence.xml.
Cách giải quyết đầu tiên mà tôi tìm thấy là chú thích trong thực thể mà đối với GeometryUserType, tôi sẽ sử dụng phương ngữ Postgis như trong:
@TypeDefs({@TypeDef(name="org.hibernatespatial.GeometryUserType",
parameters={@org.hibernate.annotations.Parameter(name="dialect",value="org.hibernatespatial.postgis.PostgisDialect")},
typeClass=org.hibernatespatial.GeometryUserType.class)})
Điều đó sẽ buộc Hibernate sử dụng Postgis cho thực thể đó.
Cách giải quyết thứ hai, phù hợp hơn với tôi (tôi cần có thể định cấu hình điều này và sử dụng các phương ngữ khác nhau cho một thực thể tùy thuộc vào đơn vị duy trì và môi trường) là sử dụng tệp ánh xạ trong đơn vị duy trì.
<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>
Trong tệp pom của tôi, tôi sẽ tạo tệp ánh xạ đó thành tệp mà tôi cần, sử dụng các cấu hình và biến Maven.
<hibernate.mappingfile>oracle.hbm.xml</hibernate.mappingfile>
Hoặc:
<hibernate.mappingfile>postgis.hbm.xml</hibernate.mappingfile>
Vì vậy, tôi sẽ lấy ví dụ một postgis.hbm.xml
tệp:
<?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>
Và một 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>
Tôi tự hỏi liệu có cách nào tốt hơn để làm điều này, nhưng không có cách nào mà tôi có thể tìm thấy trong những ngày này, hoặc tôi đã được trả lời ở đây. Hy vọng rằng điều này sẽ giúp ích cho ai đó.