【发布时间】:2015-12-07 20:58:41
【问题描述】:
我有一个 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 或 Production,具体取决于环境
例如,这允许我们在不更改源代码的情况下配置日志(我们使用 SLF4J 和 logback),logback configuration 文件看起来像:
<?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>
我显示 logback conf 文件是因为我想用 JPA persistence.xml conf 文件做这样的事情
我要配置的是persistence.xml中的hibernate.show_sql
<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>
如何在persistence.xml(如logback.xml)内配置JPA/Hibernate?
如果无法以 JavaEE 方式以编程方式配置 JPA/Hibernate?我们使用 JPA 做:
@PersistenceContext(unitName = "myappPU", type = PersistenceContextType.EXTENDED)
private EntityManager value ;
我想将EntityManagerFactory 配置为Map<String,Object> getProperties() 方法,但javadoc 说:“更改地图的内容不会更改配置”那么怎么办?
编辑
谢谢@Nayan Wadekar 和@Martijn
没有测试@Nayan Wadekar 的解决方案,我认为调用Persistence.createEntityManagerFactory(unitName, map) 会返回一个新的EntityManagerFactory,但不会更改WildFly 使用的EntityManagerFactory,因此不会影响注入的entityManager
@Martijn Burger 的解决方案很有启发性,我学到了很多关于 CDI 的知识,但是,如果我很好地理解了解决方案,它会让我编辑 beans.xml CDI conf 文件而不是 persistence.xml JPA conf 文件,然后我不知道如何使用 JNDI 配置 beans.xml,例如 logback.xml,以便在不编辑任何内容的情况下部署我的战争......
但是这两个回答给了我一些线索:
- 也许我可以通过编程方式更改
EntityManagerFactoryWildFly 正在使用 via JNDI - 也许我可以写一个CDI producer method 在应用程序中注入
EntityManager
我会努力的……
这些回答让我觉得我不够精确:我的目标是在开发、生产或测试中部署相同的war,而不需要编辑任何东西,甚至是 conf 文件(但可能这不是一个好主意...... )
【问题讨论】:
-
不,尝试
Persistence.createEntityManagerFactory(unitName, map)并在地图中提供所需的属性值。使用getProperties(),它会返回当前配置,如果地图中的值发生更改,则不会影响。 -
如何在你的
persistence.xml中创建不同的persistence-units 并将它们作为替代注入? -
这篇文章可能会有所帮助:antoniogoncalves.org/2014/05/25/…
标签: hibernate jakarta-ee jpa jndi wildfly