使用 JDBC 和 persistence.xml

Posted

技术标签:

【中文标题】使用 JDBC 和 persistence.xml【英文标题】:using JDBC with persistence.xml 【发布时间】:2010-05-02 10:05:21 【问题描述】:

我正在构建一个框架来管理对数据库的访问。

框架从用户那里获取任务并处理管理对数据库的访问的连接池。用户只需向我发送 SQL 命令。

我想支持的功能之一是使用 JPA,在这种情况下,我将提供实体管理器。在某些情况下,我想提供 JDBC 访问以及 JPA 访问。数据库的参数写在 XML 文件中。

所以对于 JPA,我需要在 persistence.xml 中编写属性,因此再次为 JDBC 编写相同的参数就不会那么聪明了。你知道我是否可以从persistence.xml 中获取数据库的参数,你知道是否有源代码可以做到这一点。还是我应该自己解析persistence.xml?

【问题讨论】:

如果您在容器中,您可以从 JNDI 获取 DataSource。为什么你不能使用它? 【参考方案1】:

你知道我是否可以从persistence.xml 获取数据库的参数,你知道是否有源代码可以做到这一点。还是我自己解析persistence.xml

我不知道标准 JPA API 中允许检索驱动程序类名称、jdbc url、用户名和密码的任何内容。

第二个问题,这些属性的键在 JPA 1.0 中没有标准化。例如,Hibernate 将使用:

<property name="hibernate.connection.driver_class" value=""/>
<property name="hibernate.connection.url" value=""/>
<property name="hibernate.connection.username" value=""/>
<property name="hibernate.connection.password" value=""/>

虽然 EclipseLink 将使用:

<property name="eclipselink.jdbc.driver" value=""/>
<property name="eclipselink.jdbc.url" value=""/>
<property name="eclipselink.jdbc.user" value=""/>
<property name="eclipselink.jdbc.password" value=""/>

这可能会使解析变得脆弱。

如果这是一个选项,也许您可​​以使用属性文件来存储提供程序特定的键和值(我建议使用标准化的 JPA 2.0 属性作为键)。例如:

# keys for JPA
javax.persistence.jdbc.driver = hibernate.connection.driver_class 
javax.persistence.jdbc.url = hibernate.connection.url
javax.persistence.jdbc.user = hibernate.connection.username
javax.persistence.jdbc.password = hibernate.connection.password

# values common to JPA and JDBC
driver = org.h2.Driver
url = jdbc:h2:mem:test
username = scott
password = tiger

并使用Persistence.createEntityManagerFactory(String, Map) 并传递Map,您将使用文件中的属性来创建EntityManagerFactory

Map map = new HashMap(); 
map.put(...);
...
EntityManagerFactory emf = Persistence.createEntityManagerFactory("MyPu", map);

【讨论】:

以上是关于使用 JDBC 和 persistence.xml的主要内容,如果未能解决你的问题,请参考以下文章

如何隐藏数据库密码?

eclipselink 连接池

没有persistence.xml的JPA

如何使用持久性动态配置数据库连接

如何使用嵌入的 JPA 和 JavaDB 从 Java 代码创建数据库表?

Spring Security JDBC 和 Hibernate JPA