如何在不使用 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 webapp 和 on 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}"/>
我需要为使用 JPA 的 Web 应用程序生成部署架构。 服务器是使用 Hibernate 作为 JPA 提供程序的 Wildfly 9。
我可以通过添加
来实现<property name="hibernate.hbm2ddl.auto" value="create" />
至persistence.xml。
是否有另一种方法可以在 Wildfly 9 中设置此 属性 per webapp 和 on 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}"/>