如何在不使用 persistence.xml 的 Wildfly 部署中设置休眠。hbm2ddl.auto

How to set hibernate.hbm2ddl.auto on deployment in Wildfly NOT using persistence.xml

我需要为使用 JPA 的 Web 应用程序生成部署架构。 服务器是使用 Hibernate 作为 JPA 提供程序的 Wildfly 9。

我可以通过添加

来实现
<property name="hibernate.hbm2ddl.auto" value="create" />

至persistence.xml。

是否有另一种方法可以在 Wildfly 9 中设置此 属性 per webappon deployment?我也试过hibernate.properties,但是没有效果。

没有开箱即用的 webapp 特定 部署 属性。

但是你可以设置一个你在 persistence.xml:

中引用的 webapp 特定系统 属性
<persistence-unit >
  ...
  <properties>
    <property name="hibernate.hbm2ddl.auto" value="${mywebapp.hibernate.hbm2ddl.auto}" />
  </properties>
</persistence-unit>

可以在 standalone.conf(.bat) 或 standalone.xml:

中设置系统 属性
<server xmlns="urn:jboss:domain:3.0"> 
  <extensions> ... </extensions>
  <system-properties>
    <property name="mywebapp.hibernate.hbm2ddl.auto" value="create"/>
    ...
  </system-properties>
  ...
</server>

唯一的缺点:您必须在 每个 环境中设置系统 属性 - 没有默认值。

另一种选择是创建一个 Integrator 来设置设置中的值。不幸的是,配置在开头被读入 Settings 对象,Settings.setAutoCreateSchema() 和另一个 hibernate。 hbm2ddl.auto 特定属性受包保护,但您可以通过反射设置它们:

public class AutoCreateSchemaIntegrator implements Integrator {

  @Override
  public void integrate(Configuration config, SessionFactoryImplementor factory, 
            SessionFactoryServiceRegistry registry) {
    Settings settings = factory.getSettings();

    try {
      Method setter = settings.getClass().getDeclaredMethod("setAutoCreateSchema", boolean.class);
      setter.setAccessible(true);
      setter.invoke(settings, myDeploymentSpecificProperty);
    } catch (ReflectiveOperationException | SecurityException e) {
      // handle exception
    }
  }
}

您需要将该集成商的完整限定 class 名称写入 META-INF/services/org.hibernate.integrator.spi.Integrator:

com.myproject.AutoCreateSchemaIntegrator

如果您想动态确定 hbm2ddl 设置,这是最佳选择。

如果您使用 Spring 和 JPA,您可以在 spring 配置 xml 中定义所有持久性信息。所以你可以包含 hibernate.hbm2ddl.auto 到它。使用 org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean 作为 EntityManagerFactory 的示例 os Spring 配置文件:

  <!-- DataSource reachable by jndi,  -->
  <jee:jndi-lookup id="myDataSource" jndi-name="jdbc/XADatasource" expected-type="javax.sql.DataSource" />

  <!-- jpa Properties used later in Hibernate configuration  -->
  <util:properties id="jpaHibernateProperties">
    <prop key="hibernate.transaction.jta.platform">
      org.hibernate.service.jta.platform.internal.JBossAppServerJtaPlatform
    </prop>
    <prop key="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect</prop>
    <!-- validate | update | create | create-drop --> 
    <prop key="hibernate.hbm2ddl.auto">create</prop>
    <prop key="hibernate.show_sql">false</prop>
    <prop key="hibernate.format_sql">false</prop>
    <prop key="javax.persistence.transactionType">JTA</prop>
    <prop key="javax.persistence.validation.mode">AUTO</prop>
  </util:properties>

  <!-- Entity manager definition. No need of persistence.xml -->
  <bean id="myEntityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    <property name="jpaVendorAdapter">
      <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
        <property name="databasePlatform" value="org.hibernate.dialect.Oracle10gDialect" />
      </bean>
    </property>
    <property name="packagesToScan">
      <list>
        <value>com.mycompany.myproject</value>
      </list>
    </property>
    <property name="persistenceUnitName" value="myPU" />
    <property name="jtaDataSource" ref="myDataSource" />
    <!-- Hibernate specific params defined previously -->
    <property name="jpaProperties" ref="jpaHibernateProperties" />
  </bean>

对于 wildfly,您可以使用带默认值的 ${env} 表达式:

<property name="mywebapp.hibernate.hbm2ddl.auto" value="${env.DB_AUTO:validate}"/>