我有一个JavaEE应用程序(WildFly 8.2应用程序服务器,JPA 2.1,Hibernate 4.3 ...)
当我使用JSF时,我使用JSF project stage(值为Development
或SystemTest
或Production
根据我们是否在开发中或在测试或产品服务器)
我们通过WildFly中的JNDI配置JSF项目阶段,将JBoss how to与WlidFly specific way结合起来,以便查找"java:/env/jsf/ProjectStage"
返回Development
或SystemTest
或{ {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 EntityManagerFactory
我会尝试......
这些回复让我觉得我不够准确:我的目标是在dev,prod或test中部署相同的EntityManager
而不用编辑任何东西甚至conf文件(但可能是一个不太好的主意。 ..)
答案 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
。