1

我想使用 JOOQ 从 Ninja Framework 访问我的数据库。如何从控制器获取 JDBC 连接?

这是我发现不太有效的资源。

如何以编程方式检索持久性单元使用的数据源- 从 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
}
4

2 回答 2

2

缺少任何直接从 JDBCConnectionDataSourceninja 框架中检索的选项,标准方法应该是从以下位置“解包”它EntityManager

Connection connection = em.unwrap(Connection.class);

另请参阅:如何在 Java EE 6 中从 JPA2 EntityManager 获取数据源或连接

此处记录了一种特定于 Hibernate 的方法:如何以编程方式检索持久性单元使用的数据源

于 2015-12-28T09:01:27.193 回答
2

跟进@LukasEder 的回答,这是一种方法:

    HibernateEntityManagerFactory hibernateEntityManagerFactory = ((EntityManagerImpl) entityManager).getFactory();
    SessionFactoryImpl sessionFactoryImpl = (SessionFactoryImpl) hibernateEntityManagerFactory.getSessionFactory();
    C3P0ConnectionProvider c3P0ConnectionProvider = (C3P0ConnectionProvider) sessionFactoryImpl.getConnectionProvider();

    Connection connection = c3P0ConnectionProvider.getConnection();

这显然是非常非常奇怪和糟糕的代码。

一个干净的解决方案是通过 Ninja 直接提供对 Connection / DataSource 的访问(将连接池与 Hibernate 或任何实现分开)。这并不难,部分是在 ebeans 插件中完成的。如果您有兴趣贡献代码,让我们在我们的邮件列表中讨论这个问题:)

于 2015-12-28T19:43:55.380 回答