0

私はプロジェクトに取り組んでおり、非常に不可解な問題に遭遇しました。

いくつかのコンテキスト: プロジェクトは、Maven 3.0.4 をビルド ツールとして使用し、Spring (3.2.3.RELEASE) を依存性注入に使用する、かなり標準的な Java 7 プロジェクトです。永続化には Hibernate (4.1.12.Final) が使用されます。

永続性関連の単体テスト (Spring の AbstractTransactionalJUnit4SpringContextTests を使用) を実行すると、テスト専用に作成された一時データベースにスキーマが作成されます (hibernate の hibernate.hbm2ddl.auto=update プロパティを使用)。

これはすべて、私の開発マシン (Linux Mint 12) でうまく機能します。ただし、ラップトップでまったく同じコードを実行すると (Linux Mint 15 の最近のインストール)、Hibernate が外部キーを作成していないことがわかります。

これは特に奇妙です:

  • 私はゼロから構築されたまったく同じソフトウェア(同一のチェックアウト)を実行しています(クリアされた.m2リポジトリ)
  • まったく同じ Maven バージョン (3.0.4) を使用
  • 同一の Spring と Hibernate のバージョン (これらはソースコードでチェックアウトされた maven ビルド構成で構成されているため)
  • 実質的に同一のPostgresqlデータベース(作業マシンではパッケージバージョン9.1.9-0ubuntu11.10、ラップトップでは9.1.9-1ubuntu1)を使用し、(ロケール設定を除いて)まったく同じ構成を持っています
  • データベースはpostgresスーパーユーザーを使用してアクセスされるため、権限は問題になりません

通常、私は奇妙な問題の根源にたどり着くのが得意ですが、これには完全に困惑しています。これを引き起こす可能性のある関連する違いは見当たりません...これの原因を見つける方法についてのリードは大歓迎です!

この問題には、次の 2 つの原因が考えられます。

  • ラップトップのロケールを少しいじりましたが、これがどういうわけかこの問題を引き起こす可能性がありますか?
  • 以下にある Hibernate のプロパティでは、PostgreSQL82Dialect が使用されていることがわかります。以下について言及しているこの Hibernate フォーラムのスレッドを見つけました。

ProgressDialect を使用しているのを見ましたが、この方言はテーブルの変更をサポートしていません (ProgressDialect.hasAlterTable() は false を返します)。

これはおそらくこの問題の最も良い原因のように思えますが、Hibernate 構成が両方で同一であるため、なぜ一方のセットアップでは機能し、他方のセットアップでは機能しないのか、まだ理解できません...

追加情報:

ハイバネート構成 (ただし、これは両方のセットアップで同じです!):

<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    <property name="dataSource" ref="dataSource" />
    <property name="persistenceProviderClass" value="org.hibernate.ejb.HibernatePersistence" />
    <property name="persistenceUnitManager" ref="jpaPersistenceUnitManager" />
    <property name="jpaDialect" ref="hibernateJpaDialect" />
    <property name="jpaProperties">
        <props>
            <prop key="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.EhCacheRegionFactory</prop>
            <prop key="hibernate.cache.use_minimal_puts">false</prop>
            <prop key="hibernate.cache.use_query_cache">true</prop>
            <prop key="hibernate.cache.use_second_level_cache">true</prop>
            <prop key="hibernate.cache.use_structured_entries">true</prop>
            <prop key="hibernate.dialect">org.hibernate.dialect.PostgreSQL82Dialect</prop>
            <prop key="hibernate.generate_statistics">false</prop>
            <prop key="hibernate.hbm2ddl.auto">update</prop>
            <prop key="hibernate.jdbc.use_get_generated_keys">false</prop>
            <prop key="hibernate.show_sql">false</prop>
            <prop key="net.sf.ehcache.configurationResourceName">/ehcache-unity-persistence.xml</prop>
        </props>
    </property>
</bean>

役立つと思われる場合は、お気軽に詳細情報をリクエストしてください。または、何かをチェック/試してほしい場合は、お知らせください。

これは本当に私を悩ませています!

4

1 に答える 1

1

Hoàng Long からのログを確認するためのヒントから、答えがわかりました。どうやら、私のデータベースが破損していたようです。

エラーで失敗する外部キー制限を作成するために使用される「ALTER TABLE」ステートメントを除いて、すべてが完全に機能します。

どうやらpostgresqlのインストールがおかしくなったようです...

于 2013-08-21T14:35:42.587 に答える