Внедрить 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 подход описан здесь: Как программно получить источник данных, используемый модулем персистентности.