【问题标题】:How to configure JPA according to WildFly environment (dev or test or prod)如何根据 WildFly 环境(开发或测试或生产)配置 JPA
【发布时间】:2015-12-07 20:58:41
【问题描述】:

我有一个 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" 的查找返回 DevelopmentSystemTestProduction,具体取决于环境

例如,这允许我们在不更改源代码的情况下配置日志(我们使用 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&lt;String,Object&gt; 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,以便在不编辑任何内容的情况下部署我的战争......

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

  • 也许我可以通过编程方式更改 EntityManagerFactory WildFly 正在使用 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


【解决方案1】:

我发现利用项目阶段的效果不太好。首先,它与 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

【讨论】:

  • 谢谢,但是如何在WildFly中添加系统属性呢?我尝试在standalone-full.xml&lt;extensions&gt; 元素之后添加&lt;system-properties&gt;&lt;property name="my.hibernate.debug" value="true"/&gt;&lt;/system-properties&gt;,但它似乎不起作用
  • 嗯,项目阶段:dev、test、prod... 比 JSF 更通用,在 JSF 之外我使用 JNDI 而不是 JSF FacesContext 访问项目阶段,所以这两种技术是'不绑定只是 JNDI 项目阶段值和名称由 JSF 指定,这对我来说似乎没问题。 (即使项目阶段名称中有“jsf”,系统也可以在没有 JSF 的情况下工作)
  • 这就是你的做法。你也可以试试-D。你确定你是使用standalone-full 开始的吗?任何以 javax.faces 开头的都是 JSF 特定的。
猜你喜欢
  • 2017-05-05
  • 2021-09-10
  • 2016-03-22
  • 1970-01-01
  • 2019-07-13
  • 2016-09-22
  • 2016-02-27
  • 2011-08-06
  • 1970-01-01
相关资源
最近更新 更多