如何在Wildfly中部署时使用persistence.xml设置hibernate.hbm2ddl.auto

我需要为使用JPA的webapp生成部署模式。 服务器是Wildfly 9,Hibernate是JPA提供者。

我可以通过添加来实现这一点

 

到persistence.xml。

是否有另一种方法可以在Wildfly 9中为每个webapp部署设置此属性? 我也尝试过hibernate.properties,但这没有效果。

没有开箱即用的特定于Web应用程序的部署属性。

但您可以设置您在persistence.xml中引用的特定于webapp的系统属性:

  ...     

可以在standalone.conf.bat )或standalone.conf设置系统属性:

   ...    ...  ...  

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

另一种选择是创建一个Integrator来设置设置中的值。 不幸的是,配置在开始时读入Settings对象,而Settings.setAutoCreateSchema()和其他hibernate.hbm2ddl.auto特定属性都受包保护,但您可以使用reflection设置它们:

 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 } } } 

您需要将该集成器的完全限定类名写入META-INF/services/org.hibernate.integrator.spi.Integrator

 com.myproject.AutoCreateSchemaIntegrator 

如果要动态确定hbm2ddl设置,这是最佳选项。

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

       org.hibernate.service.jta.platform.internal.JBossAppServerJtaPlatform  org.hibernate.dialect.Oracle10gDialect  create false false JTA AUTO           com.mycompany.myproject        

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