我有一个JavaEE应用(WildFly 8.2应用服务器,JPA 2.1,Hibernate的4.3 ...)如何根据WildFly环境(开发或测试或正式版)
配置JPA,因为我用JSF我使用在JSF project stage(至极值Development
或SystemTest
或Production
根据如果我们在开发或测试或督促服务器)
我们通过JNDI配置中WildFly这JBoss how to与WlidFly specific way这样的查找相结合的JSF项目阶段"java:/env/jsf/ProjectStage"
返回Development
或SystemTest
或Production
取决于环境
例如,这允许我们配置日志,但不改变源代码(我们使用SLF4J和的logback)和文件的样子:
<?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
如何在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
,但不改变EntityManagerFactory
使用通过WildFly,这样就不会影响注入entityManager
@Martijn Burger的解决方案非常具有启发性,我学到了很多关于CDI的知识,但是,如果我很好地理解了溶胶ution,这让我编辑beans.xml
CDI的conf文件,而不是persistence.xml
JPA的conf文件,我没搞清楚如何使用JNDI配置beans.xml
如以没有任何编辑部署我的战争logback.xml
...
但是,这两种反应给了我一些线索:
- 也许我可以改变编程的
EntityManagerFactory
WildFly使用via JNDI - 也许我可以写一个CDI producer method注入在应用
EntityManager
我会试试...
这些反应让我觉得我没有足够的精确性:我的目标是在开发,产品或测试中部署相同的war
,甚至不需要编辑任何配置文件(但可能这不是一个好主意......)
不,尝试'Persistence.createEntityManagerFactory(unitName,map)'并在地图中提供必需的属性值。使用'getProperties()'它会返回当前的配置,如果map中的值发生更改,它将不会产生影响。 –
如何在你的'persistence.xml'中创建不同的'persistence-unit',并将它们作为备选注入? –
这个帖子可能会有所帮助:http://antoniogoncalves.org/2014/05/25/switch-datasource-with-cdi-alternatives-and-stereotypes/ –