2011-05-18 13 views
1

我想在代碼中找到我的數據源名稱。有沒有辦法做到這一點? 我正在使用eclipselink。JPA - 是否有檢索持久性單元信息的方法/方法

謝謝 更具體地說,我的目標是獲得一個jdbc連接對象。 我知道我能做到這一點直通:

datasource = (DataSource) (new InitialContext()).lookup("my_data_source_name") 
connection = dataSource.getConnection(); 

但我不想硬編碼在我的代碼數據源名稱。

我也試過

java.sql.Connection connection = em.unwrap(java.sql.Connection.class); 

,它總是返回null。

+0

提到你的目標可能有助於獲得更合適的答案。你想實現什麼? – 2011-05-18 15:58:43

回答

0

Here's我所發現的有用:

private DataSource createDataSource() { 
ClientDataSource dataSource = new ClientDataSource(); 
dataSource.setServerName("localhost"); 
dataSource.setPortNumber(1527); 
dataSource.setDatabaseName("sample"); 
dataSource.setUser("app"); 
dataSource.setPassword("app"); 
return dataSource; 
} 

private EntityManagerFactory getEntityManagerFactory() { 
if (emf == null) { 
    Map properties = new HashMap(); 
    properties 
    .put(PersistenceUnitProperties.NON_JTA_DATASOURCE,createDataSource()); 
    emf = Persistence.createEntityManagerFactory(PU_NAME, properties); 
} 
return emf; 
} 

你能在代碼中創建您的數據源,而不是通過persistence.xml中配置?

+0

謝謝凱爾。我已經創建了一個persistence.xml。有沒有像JPA/Eclipselink API中的getEntityManger()。getDataSourceName()方法? – neo 2011-05-18 14:51:16

2
java.sql.Connection connection = em.unwrap(java.sql.Connection.class); 

應該工作,你使用的是什麼版本?確保交易處於活動狀態。

要得到你應該能夠使用的數據源名稱,

((JNDIConnector)em.unwrap(JpaEntityManager.class).getSession().getLogin().getConnector()).getName(); 
5

.unwrap()應該要走的路,寫在EclipseLink wiki

因爲不在交易內,所以在撥打em.unwrap(java.sql.Connection.class);時我也用空了。當這樣調用時:

em.getTransaction().begin(); 
java.sql.Connection conn = em.unwrap(java.sql.Connection.class); 
// ... 
em.getTransaction().commit(); 

一切工作正常!