我使用JPA 2.1和我的財產以後這樣如何動態地在@PersistenceContext
public class EntityManagerProducer {
@Produces
@PersistenceContext(unitName="first_PU")
private EntityManager em;
...
如何動態修改unitName
在@PersistenceContext(unitName = "somer_PU")
使用於其他實體管理器?這可能嗎?
非常重要更新
我有一個部署的應用程序中,persistence.xml
這個樣子的:
<persistence-unit name="db1" transaction-type="JTA">
<jta-data-source>java:/jboss/datasources/PostgresDS</jta-data-source>
<properties>
<property name="hibernate.hbm2ddl.auto" value="update"/>
<property name="hibernate.show_sql" value="true"/>
<property name="hibernate.format_sql" value="true"/>
<property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQLDialect"/>
<property name="hibernate.cache.use_second_level_cache" value="false"/>
<property name="hibernate.jdbc.batch_size" value="50"/>
<property name="hibernate.jdbc.batch_versioned_data" value="true"/>
<property name="hibernate.order_inserts" value="true"/>
<property name="hibernate.order_updates" value="true"/>
<property name="hibernate.generate_statistics" value="true"/>
<property name="javax.persistence.schema-generation.database.action" value="drop-and-create"/>
<property name="jboss.entity.manager.jndi.name" value="java:app/entitymanager/db1"/>
<property name="jboss.entity.manager.factory.jndi.name" value="java:app/entitymanagerfactory/db1"/>
</properties>
在運行時,可以修改persistence.xml並添加另一個持久性單元,但我需要通過傳遞持久化單元的名稱或其他方法來獲取我需要的entitymanager,然後使用它爲我想要的。然後我可以提供持久單元的另一個名稱並獲得一個不同的實體管理器。當然我希望交易過程仍然是集裝箱管理。
對不起,但我仍然看不到在運行時更改持久單元名稱的目的。你可以解釋嗎?你的應用程序是否需要與多個不同的數據庫交談?你是什麼意思*在運行時,可以修改persistence.xml ... *? –
我的意思是,當應用程序部署在服務器上時,它可以添加更多的持久性單元。是的,我需要我的應用程序可以與多個不同的數據庫交談。 –
但是僅僅動態定義DataSource還不夠?說實話,你可以在你的java代碼中連接到任何數據庫:打開一個連接並執行所需的SQL語句(不使用'EntityManager')。 順便說一句:你的應用程序與固定數字對話的數據庫數量是多少? –