如何从Entity Manager获取jpa数据源属性

时间:2013-12-20 12:53:38

标签: java jpa entitymanager jta

大家好

我想知道是否可以通过实体管理器获取数据库连接属性。

我的persistence.xml看起来像这样

<persistence ...>
     <persistence-unit name="default" transaction-type="JTA">
          <jta-data-source>DatasourceForTestSystem</jta-data-source>
          <class> some.package.and.some.Class </class>
          ...
     </persistence-unit>
</persistence>

我想要像

这样的东西
String host = em.getSomeFunction().getProperties().get("server");
String database = em.getSomeFunction().getProperties().get("database");
or
String url = em.getSomeFunction().getConnectionPool().getURL();

其中url类似于jdbc:oracle:thin:@1.2.3.4:5678:database。 我正在使用带有EclipseLink的JDeveloper 12c,一个Oracle数据库和NO Hibernate。

有人知道如何获取有关连接属性的信息吗?

亲切的问候,

STEFI

- 更新 -

@Kostja:再次请求你的帮助,但正如我在帖子中提到的,我根本不使用Hibernate。

我已经尝试过像这样使用Connection.class

java.sql.Connection conn = em.unwrap(java.sql.Connection.class);
来自here

。我总是在本声明中为Connection和getSession()获得NPE

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

来自here

我很困惑为什么这些解决方案对我有用。也许我错过了一些东西: - (

1 个答案:

答案 0 :(得分:1)

使用JPA最远的方法是查询EntityManagerFactoryConnection的属性。可用属性列表因提供商之间以及单个提供商的不同版本之间而异。

像这样访问EMF的属性:

Map<String,Object> props = emf.getProperties();

亲自动手Connection需要更多参与,并取决于JPA的实施。这可能适用于Hibernate,courtesy @Augusto

EntityManagerFactory强制转换为HibernateEntityManagerFactory,  致电getSessionFactory()并将其投放至SessionFactoryImpl,致电getConnectionProvider()

connectionProvder.getConnection();