2010-03-09 41 views
0

嘿傢伙們,我的目標是創建一個EntityManager使用屬性取決於哪個數據庫正在使用。我見過這樣的事情在我所有的谷歌搜索做了(我使代碼更基本的對這個問題的目的):使用EntityManagerFactory導致重複的主鍵異常

@PersistenceUnit 
private EntityManagerFactory emf; 
private EntityManager em; 
private Properties props; 

@PostConstruct 
public void createEntityManager(){ 

//if oracle set oracle properties else set postgres properties 

emf = Persistence.createEntityManagerFactory("app-x"); 
em = emf.createEntityManager(props); 
} 

這工作,我可以成功加載Oracle或Postgres的性質,我可以選擇來自任一數據庫。不過,我在做INSERT語句時遇到了問題。每當INSERT完成時,我每次都會得到一個重複的主鍵異常!任何人都可以闡明爲什麼會發生這種情況?由於 -Brad

回答

1

container-managed環境中,您可以直接注入一個EntityManager

爲了獲得一個EntityManager實例,注入實體管理器到應用程序組件:

@PersistenceContext 
EntityManager em; 

如果您需要處理不同的persistence units(並因此處理幾個EntityManager個實例),在persistence.xml中聲明它們並獲得正確的EntityManager注射用它的名字:

@PersistenceContext(unitName = "MyFirstPU") 
EntityManager em; 

更新:根據Specifying the Database(也提到了這一點blog post)的EclipseLink可能能夠自動檢測數據庫平臺和eclipselink.target-database是可選的:

如果使用默認持久性提供程序,則提供程序將嘗試根據連接元數據自動檢測數據庫類型。

如果這適用於Oracle和PostgreSQL(而且我的理解是它應該),那麼客戶只需要設置一個IMO的數據源即可。

+0

我的最終目標是讓我的應用程序檢測正在使用哪種類型的數據庫(在glassfish中設置)並相應地設置EntityManager。我的研究指出使用EntityManagerFactory是最好的方法。你怎麼看? – bradd 2010-03-10 18:47:51

+0

@bradd爲什麼你的應用需要檢測數據庫?你能詳細解釋一下嗎? – 2010-03-10 18:58:34

+0

我們的目標是讓我們的客戶能夠將glassfish配置爲使用postgres或oracle,而不必擔心修改persistence.xml文件。我們也希望遠離爲不同數據庫創建不同版本的應用程序。 – bradd 2010-03-10 19:43:38