10

我有一个在 Weblogic 容器中使用的 Java EE Web 应用程序(hibernate3、seam)。我想介绍用于模式迁移的 Liquibase。目前我们使用

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

我们想放弃它,因为它可能很危险。

我希望迁移在部署时自动发生,因此我使用了 servlet 侦听器集成。

在 web.xml 中,第一个监听器是:

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

可悲的是,这个监听器在 Hibernate 初始化之后开始发挥作用,它会抛出丢失的表错误(因为模式是空的)。我像老板一样在谷歌上搜索了几个小时,现在我有点困惑。

提前致谢

更新

如果我设置<property name="hibernate.hbm2ddl.auto" value="none" />,liquibase 会成功完成它的工作,并且应用程序会按预期启动。如果我设置validate,似乎休眠模式验证发生在 liquibase 之前,并且由于缺少表而哭泣。

更新

似乎Seam初始化了Hibernate,但Liquibase侦听器列在SeamListener之前,所以我不知道如何同时启用模式验证和liquibase......

4

2 回答 2

1

我的理解是 LiquibaseServletListener 需要更改使用liquibase.changelog上下文参数传递的日志文件的路径。所以您已经生成了更改日志,还是我在这里遗漏了什么?

你可以看看 Liquibase 提供的liquibase hibernate 集成库。该库适用于经典的 hibernate 配置(通过 .cfg 和 .xml 文件)以及通过 persistence.xml 的 JPA 配置。

AFAIK,生成更改日志和运行更改日志是两个独立的过程。Liquibase hibernate 集成库有助于根据持久性单元中实体的当前状态和当前数据库状态的差异生成更改日志。

于 2013-11-14T13:28:59.327 回答
1

如何确定 web.xml 中侦听器的顺序

你应该放置:

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

在 ORM 或框架其他相关侦听器之前。

我使用 Spring beans 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 回答