Внедрить java.sql.Connection в контроллер для Ninja Framework

Я хочу использовать 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
}

2 ответа

Решение

В ответ на ответ @LukasEder это подход:

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

    Connection connection = c3P0ConnectionProvider.getConnection();

Это, очевидно, очень, очень странный и плохой код.

Чистое решение состоит в том, чтобы предоставить доступ к Connection / DataSource непосредственно Ninja (отделяя пул соединений от Hibernate или любой другой реализации). Это не слишком сложно и частично сделано в плагине ebeans. Давайте обсудим это в нашем списке рассылки, если вы заинтересованы в добавлении кода:)

Если не считать какой-либо опции для получения JDBC Connection или же DataSource непосредственно из структуры ниндзя, стандартный подход должен заключаться в том, чтобы "развернуть" его из EntityManager:

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

См. Также: Как получить источник данных или соединение из JPA2 EntityManager в Java EE 6

Специфичный для Hibernate подход описан здесь: Как программно получить источник данных, используемый модулем персистентности.

Другие вопросы по тегам