sql >> データベース >  >> RDS >> PostgreSQL

PostGIS接続が定義されているときにOracleConnectionが見つからない

    コメントしたように、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>
    

    これを行うためのより良い方法があるかどうか疑問に思いますが、最近私が見つけることができなかった、または私がここで答えられたということはありません。これが誰かに役立つことを願っています。




    1. RecyclerViewでのデータの表示

    2. SQLiteの名前変更列

    3. MySQLに固執する10の理由

    4. 別のテーブルの列データを使用して他のテーブルからデータを取得するにはどうすればよいですか?