将 java.sql.Connection 注入 Ninja 框架的控制器
Inject java.sql.Connection into controller for Ninja Framework
我想使用 JOOQ 从 Ninja 框架访问我的数据库。如何从控制器获得 JDBC 连接?
这是我发现不太有用的资源。
How to retrieve the datasource used by a persistence unit programmatically - 从 EntityManager 获取连接的一组乏味步骤。
http://blog.jooq.org/2015/05/26/type-safe-queries-for-jpas-native-query-api/ - 通过在 JOOQ 中构建查询并传递给 EntityManager.createNativeQuery 来工作。它很实用,但它不如连接好。
我可以像这样将连接注入控制器吗:
public Result myController(@DBConnection Connection connection) {
List<String> articles = DSL.using(connection).selectFrom(ARTICLE).fetch(ARTICLE.TITLE);
return Results.html().render("template", articles);
}
DropWizards 有一个看起来像赢家的插件:https://github.com/benjamin-bader/droptools/tree/master/dropwizard-jooq
public BlogPost getPost(@QueryParam("id") int postId, @Context DSLContext database) {
BlogPostRecord post = database
.selectFrom(POST)
.where(POST.ID.equal(postId))
.fetchOne();
// do stuff
}
缺少直接从 ninja 框架检索 JDBC Connection
或 DataSource
的任何选项,标准方法应该是 "unwrap" 从 [=13] =]:
Connection connection = em.unwrap(Connection.class);
另请参阅:How to get DataSource or Connection from JPA2 EntityManager in Java EE 6
此处记录了一种特定于 Hibernate 的方法:How to retrieve the datasource used by a persistence unit programmatically
跟进@LukasEder 的回答,这是方法:
HibernateEntityManagerFactory hibernateEntityManagerFactory = ((EntityManagerImpl) entityManager).getFactory();
SessionFactoryImpl sessionFactoryImpl = (SessionFactoryImpl) hibernateEntityManagerFactory.getSessionFactory();
C3P0ConnectionProvider c3P0ConnectionProvider = (C3P0ConnectionProvider) sessionFactoryImpl.getConnectionProvider();
Connection connection = c3P0ConnectionProvider.getConnection();
这显然是非常非常非常糟糕的代码。
一个干净的解决方案是由 Ninja 直接提供对 Connection / DataSource 的访问(将连接池与 Hibernate 或任何实现分开)。这并不太难,部分是在 ebean 插件中完成的。如果您有兴趣贡献代码,让我们在我们的邮件列表上讨论它:)
我想使用 JOOQ 从 Ninja 框架访问我的数据库。如何从控制器获得 JDBC 连接?
这是我发现不太有用的资源。
How to retrieve the datasource used by a persistence unit programmatically - 从 EntityManager 获取连接的一组乏味步骤。
http://blog.jooq.org/2015/05/26/type-safe-queries-for-jpas-native-query-api/ - 通过在 JOOQ 中构建查询并传递给 EntityManager.createNativeQuery 来工作。它很实用,但它不如连接好。
我可以像这样将连接注入控制器吗:
public Result myController(@DBConnection Connection connection) {
List<String> articles = DSL.using(connection).selectFrom(ARTICLE).fetch(ARTICLE.TITLE);
return Results.html().render("template", articles);
}
DropWizards 有一个看起来像赢家的插件:https://github.com/benjamin-bader/droptools/tree/master/dropwizard-jooq
public BlogPost getPost(@QueryParam("id") int postId, @Context DSLContext database) {
BlogPostRecord post = database
.selectFrom(POST)
.where(POST.ID.equal(postId))
.fetchOne();
// do stuff
}
缺少直接从 ninja 框架检索 JDBC Connection
或 DataSource
的任何选项,标准方法应该是 "unwrap" 从 [=13] =]:
Connection connection = em.unwrap(Connection.class);
另请参阅:How to get DataSource or Connection from JPA2 EntityManager in Java EE 6
此处记录了一种特定于 Hibernate 的方法:How to retrieve the datasource used by a persistence unit programmatically
跟进@LukasEder 的回答,这是方法:
HibernateEntityManagerFactory hibernateEntityManagerFactory = ((EntityManagerImpl) entityManager).getFactory();
SessionFactoryImpl sessionFactoryImpl = (SessionFactoryImpl) hibernateEntityManagerFactory.getSessionFactory();
C3P0ConnectionProvider c3P0ConnectionProvider = (C3P0ConnectionProvider) sessionFactoryImpl.getConnectionProvider();
Connection connection = c3P0ConnectionProvider.getConnection();
这显然是非常非常非常糟糕的代码。
一个干净的解决方案是由 Ninja 直接提供对 Connection / DataSource 的访问(将连接池与 Hibernate 或任何实现分开)。这并不太难,部分是在 ebean 插件中完成的。如果您有兴趣贡献代码,让我们在我们的邮件列表上讨论它:)