如何根据WildFly环境配置JPA(dev或test或prod)

时间:2015-09-11 10:18:05

标签: hibernate java-ee jpa jndi wildfly

我有一个JavaEE应用程序(WildFly 8.2应用程序服务器,JPA 2.1,Hibernate 4.3 ...)

当我使用JSF时,我使用JSF project stage(值为DevelopmentSystemTestProduction根据我们是否在开发中或在测试或产品服务器)

我们通过WildFly中的JNDI配置JSF项目阶段,将JBoss how toWlidFly specific way结合起来,以便查找"java:/env/jsf/ProjectStage"返回DevelopmentSystemTest或{ {1}}取决于环境

例如,这允许我们在不更改源代码(我们使用SLF4J和logback)的情况下配置日志,logback configuration文件如下所示:

Production

我显示了logback conf文件,因为我想用JPA <?xml version="1.0" encoding="UTF-8"?> <configuration debug="true"> <insertFromJNDI env-entry-name="java:/env/jsf/ProjectStage" as="projectStage" /> <property name="STAGE" value="${projectStage}"/> <if condition='property("STAGE").equals("Production")'> <then> <property name="LEVEL" value="INFO"/> </then> <else> <if condition='property("STAGE").equals("SystemTest")'> <then> <property name="LEVEL" value="INFO"/> </then> <else> <property name="LEVEL" value="TRACE"/> </else> </if> </else> </if> <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern> </encoder> </appender> <logger name="DEBUG" level="TRACE"/> <root level="${LEVEL}"> <appender-ref ref="STDOUT"/> </root> </configuration> conf文件

做这样的事情

我想要配置的是persistence.xml

中的hibernate.show_sql
persistence.xml

如何在<persistence ...> <persistence-unit name="myappPU" transaction-type="JTA"> <jta-data-source>java:/jdbc/myappDS</jta-data-source> <!-- ... --> <properties> <property name="hibernate.show_sql" value="true"/> <property name="hibernate.format_sql" value="true"/> <!-- ... --> </properties> </persistence-unit> </persistence> 内配置JPA / Hibernate(例如persistence.xml)?

如果不可能如何以JavaEE方式以编程方式配置JPA / Hibernate?我们使用JPA:

logback.xml

我考虑将@PersistenceContext(unitName = "myappPU", type = PersistenceContextType.EXTENDED) private EntityManager value ; 配置为EntityManagerFactory方法,但javadoc说:&#34;更改地图内容不会改变配置&#34;那该怎么办?

修改

谢谢@Nayan Wadekar和@Martijn

没有测试@Nayan Wadekar的解决方案,我认为调用Map<String,Object> getProperties()会返回一个新的Persistence.createEntityManagerFactory(unitName, map),但不会更改WildFly使用的EntityManagerFactory,所以赢了&# 39; t注入EntityManagerFactory

@Martijn Burger的解决方案非常有启发性,我学到了很多关于CDI的知识,但是,如果我很好理解解决方案,它会让我编辑entityManager CDI配置文件而不是beans.xml JPA conf文件,我不知道如何配置persistence.xml JNDI,例如beans.xml,以便在不编辑任何内容的情况下部署我的战争......

但这两个回复给了我一些线索:

  • 也许我可以通过编程方式更改logback.xml WildFly正在使用via JNDI
  • 也许我可以在应用
  • 中写一个CDI producer method来注入EntityManagerFactory

我会尝试......

这些回复让我觉得我不够准确:我的目标是在dev,prod或test中部署相同的EntityManager而不用编辑任何东西甚至conf文件(但可能是一个不太好的主意。 ..)

1 个答案:

答案 0 :(得分:0)

我发现利用项目阶段效果不佳。首先,它与JSF紧密联系在一起。既然你正在使用JPA,那么JSF与JPA有什么关系呢?

无论如何,事实证明WildFly支持变量

<property name="hibernate.show_sql" value="${some.system.property:false}"/>
<property name="hibernate.format_sql" value="true"/>

然后在启动应用程序时,只需覆盖some.system.property