【问题标题】:writing API's with JPA使用 JPA 编写 API
【发布时间】:2013-09-10 14:07:40
【问题描述】:

在一家大公司,我们的团队提供 API 用于访问 Oracle 数据库中的数据。到目前为止,我们使用普通 SQL (JDBC) 来获取/写入数据库中的数据。 所以大多数现有的 API 看起来都是这样的(好吧,并不总是那么愚蠢:-)

public class DummyApi {

    private final DataSource datasource;

    public DummyApi(javax.sql.DataSource datasource) {
        this.datasource = datasource;

    }

    public void doSomething() throws SQLException {
         Connection connection = datasource.getConnection();
         PreparedStatement statement = connection.prepareStatement("plain sql query");
         statement.execute();
    }
}

使用这样的 API 很简单,您的最终应用程序是纯 java SE、spring 还是 javaEE 都没有关系。此外,事务 API 可以与此 API 一起正常工作。我们将它们与 spring TransactionManager(与 TransactionAwareDataSourceProxy 一起)和 CMA-Java EE 应用程序中的 JTA 一起使用。

现在我们评估在新 API 中使用 JPA。我们目前面临的一个大问题是:我们如何提供一个简单的接口,以便最终应用程序不需要了解 JPA?我们如何使用 DataSource 初始化 EntityManager(例如作为构造函数参数提供)?如果在同一个事务中有旧的、普通的 JDBC-API 和新的 JPA-API(在最终应用程序中开始/回滚),我们如何回滚?

感谢您为此事带来一点启示!

【问题讨论】:

    标签: spring api jakarta-ee jpa jdbc


    【解决方案1】:

    使用 JPA,数据源通常会在 persistence.xml 中设置。如果您需要某种动态数据源,则可以将 DataSource 作为属性传递给 Persistence.createEntityManagerFactory()。

    如果您想混合使用 JDBC,大多数 JPA 提供程序都提供了一种获取 JDBC 连接的方法。通常这是使用 em.unwrap(Connection.class) 访问的。您还可以使用 JTA 或 Spring 让事务共享相同的连接。

    【讨论】:

    • 感谢詹姆斯的回答。一个问题:你能帮助我如何将 DataSource 作为属性传递给 Persistence.createEntityManagerFactory()- 方法吗?我想它是由地图参数完成的,但我在谷歌上找不到任何有用的例子。顺便提一句。我们正在使用休眠
    猜你喜欢
    • 2020-12-16
    • 1970-01-01
    • 1970-01-01
    • 2021-02-14
    • 2011-03-22
    • 2011-09-09
    • 2020-11-25
    • 1970-01-01
    • 2019-07-22
    相关资源
    最近更新 更多