私はプロジェクトに取り組んでおり、非常に不可解な問題に遭遇しました。
いくつかのコンテキスト: プロジェクトは、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>
役立つと思われる場合は、お気軽に詳細情報をリクエストしてください。または、何かをチェック/試してほしい場合は、お知らせください。
これは本当に私を悩ませています!