以编程方式设置@PersistenceContext

时间:2017-06-05 20:46:25

标签: java jpa ejb

如何以编程方式设置@PersistenceContext,以便从简单的属性文件中获取配置(jDBC Url,Dri​​ver Class等)(这样用户可以简单地修改此文件)而不是更大的更复杂的persistence.xml文件?

我所读到的是,使用Persistence.createEntityManagerFactory("bla", properties)将完全没用,因为@PersistenceContext(unitName = "bla")将永远不会起作用(并且它不起作用,给NPE ......)。

我知道有很多教程,但是他们都使用带有硬编码数据库类型的persistence.xml(Oracle,MySQL,...),没有人解释我如何以编程方式设置这个托管bean?

1 个答案:

答案 0 :(得分:0)

鉴于您提供了ejb标记,我假设您正在一个完整的Java EE环境中执行。

您的用户永远不必触摸persistence.xml,因为它通常配置了数据源引用:

<persistence-unit name="bla" transaction-type="JTA">
   <jta-data-source>java:jboss/datasources/BlaDS</jta-data-source>
   ...

然后,用户使用其Java EE服务器实现提供的工具来创建数据源。

大多数实现都提供用于执行此任务的GUI和CLI工具。

例如,在WildFly中,CLI脚本可能如下所示:

# Execute offline
embed-server --server-config=standalone.xml

deploy postgresql-42.0.0.jre7.jar

# Add the application datasource
data-source add \
    --name=BlaDS \
    --driver-name=postgresql-42.0.0.jre7.jar \
    --connection-url=jdbc:postgresql://bladb-host:5432/bladb \
    --jndi-name=java:jboss/datasources/BlaDS \
    --user-name=bla \
    --password=bla-password \
    --use-ccm=false \
    --min-pool-size=10 \
    --max-pool-size=25 \
    --pool-prefill=true \
    --blocking-timeout-wait-millis=5000 \
    --new-connection-sql="set datestyle = ISO, European;"

通常,用户需要能够控制其他与数据库连接相关的属性,如连接池大小等,如图所示。