在一家大公司,我们的团队提供API来访问oracle DB上的数据。到目前为止,我们使用普通的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,则无关紧要。此外,transaction-API适用于此API。我们将它们与Spring TransactionManager(与TransactionAwareDataSourceProxy一起)和CMA-Java EE应用程序中的JTA一起使用。
现在我们评估在新API中使用JPA。我们目前面临的一个重大问题是:我们如何提供一个简单的界面,以便最终应用程序不需要了解JPA?我们如何使用DataSource初始化EntityManager(例如作为构造函数参数提供)?如果在同一事务中存在旧的,简单的JDBC-API和新的JPA-API(在最终应用程序中开始/回滚),我们如何回滚?
感谢您对此事进行一些了解!
答案 0 :(得分:1)
使用JPA,数据源通常会在persistence.xml中设置。如果需要某种动态数据源,则可以将DataSource作为属性传递给Persistence.createEntityManagerFactory()。
如果要混合使用JDBC,大多数JPA提供程序都提供了获取JDBC连接的方法。通常使用em.unwrap(Connection.class)访问它。您也可以使用JTA或Spring让事务共享相同的连接。