10

Weblogic コンテナーで使用している Java EE Web アプリケーション (hibernate3、seam) があります。スキーマ移行のために Liquibase を紹介したいと思います。現在、私たちは使用しています

<property name="hibernate.hbm2ddl.auto" value="update"/>

危険なので落としたい。

デプロイ時に移行を自動的に行いたいので、サーブレット リスナー統合を使用しています。

web.xml では、最初のリスナーは次のとおりです。

<listener>
    <listener-class>liquibase.integration.servlet.LiquibaseServletListener</listener-class>
</listener>

悲しいことに、このリスナーは Hibernate の初期化後に機能し、欠落テーブル エラーをスローします (スキーマが空であるため)。私は上司のように何時間もググっており、今は少し混乱しています。

前もって感謝します

アップデート

を設定する<property name="hibernate.hbm2ddl.auto" value="none" />と、liquibase はその仕事を正常に終了し、アプリは期待どおりに起動します。を設定validateすると、liquibase の前に hibernate スキーマの検証が行われ、テーブルが見つからないために泣くようです。

アップデート

Seam は Hibernate を初期化するようですが、Liquibase リスナーは SeamListener の前にリストされているため、スキーマ検証と Liquibase を同時に有効にする方法がわかりません...

4

2 に答える 2

1

web.xml でリスナーの順序を決定する方法

以下を配置する必要があります。

<listener>
    <listener-class>liquibase.integration.servlet.LiquibaseServletListener</listener-class>
</listener>

ORM またはフレームワークの他の関連リスナーの前。

Spring Bean LiquiBase アクティベーションを使用して、既に提供されているデータソース Bean を使用して DB 認証データの重複を減らします。

<bean id="liquibase" class="liquibase.integration.spring.SpringLiquibase">
    <property name="dataSource" ref="dataSource" />
    <property name="changeLog" value="classpath:sql/master.sql" />
    <property name="defaultSchema" value="PRODUCT" />
</bean>

depends-on注文使用属性を制限するには:

<bean id="entityManagerFactory"
      class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"
      depends-on="liquibase">
    <property name="dataSource" ref="dataSource" />
    <property name="jpaVendorAdapter">
        <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter" />
    </property>
    <property name="packagesToScan" value="product.domain" />
    <property name="jpaProperties">
        <props>
            <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
            <prop key="hibernate.hbm2ddl.auto">validate</prop>
        </props>
    </property>
</bean>
于 2015-12-20T12:08:02.853 に答える
1

私の理解では、LiquibaseServletListener には、liquibase.changelogコンテキスト パラメータを使用して渡される変更ログ ファイルへのパスが必要です。すでに変更ログが生成されていますか、それとも何か不足していますか?

Liquibase が提供するliquibase hibernate 統合ライブラリをご覧ください。このライブラリは、従来の hibernate 構成 (.cfg および .xml ファイル経由) と、persistence.xml 経由の JPA 構成の両方で動作します。

私の知る限り、変更ログの生成と変更ログの実行は、2 つの別個のプロセスです。Liquibase hibernate 統合ライブラリは、永続化ユニット内のエンティティの現在の状態と現在のデータベース状態の差分から変更ログを生成するのに役立ちます。

于 2013-11-14T13:28:59.327 に答える