JPA - 是否有一种方法/方法来检索持久性单元信息

时间:2011-05-18 14:37:06

标签: jpa eclipselink

我想在代码中找到我的数据源名称。有没有办法做到这一点? 我正在使用eclipselink。

感谢 更具体地说,我的目标是获得一个jdbc连接对象。 我知道我可以做到这一点:

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

但我不想在我的代码中硬编码数据源名称。

我也试过

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

并且它总是返回null。

3 个答案:

答案 0 :(得分:6)

.unwrap()应该是可行的方式,如EclipseLink wiki所述。

我也曾在调用em.unwrap(java.sql.Connection.class);时获取null,因为不在交易中。当像这样调用时:

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

一切正常!

答案 1 :(得分:2)

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

应该可以使用,您使用的是哪个版本?确保交易处于活动状态。

要获取您应该能够使用的数据源名称,

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

答案 2 :(得分: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进行配置吗?