2015-12-28 3 views
1

Я хочу использовать JOOQ для доступа к моей базе данных из Ninja Framework. Как я могу получить соединение JDBC от контроллера?Inject java.sql.Connection в контроллер для Ninja Framework

Вот ресурсы, которые я нашел, которые не совсем сработали.

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 
} 
+0

Есть ли способ заполучить «DataSource» в инфраструктуре ниндзя? –

+0

Не то, чтобы я мог сказать. Кажется, что EntityManager является единственным легко доступным. – Joe

ответ

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. Давайте обсудим это в нашем списке рассылки, если вы заинтересованы в предоставлении кода :)

+0

Это подход, с которым я пошел. Я использовал полевую инъекцию, чтобы поместить ее в ApplicationController. Я застрелю вам сообщение в списке рассылки, это похоже на размер укуса, достаточный для начала. – Joe

+1

Список рассылки: https://groups.google.com/forum/#!topic/ninja-framework/LztS40CVpFA – Joe

2

Short любой вариант для извлечения JDBC Connection или DataSource из рамки ниндзя, стандартный подход должен заключаться в «разворачивании» его от EntityManager:

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

+0

Это должно работать :) Хороший ответ! –

+0

У меня есть NPE с этим, но я не могу понять, почему. – Joe

Смежные вопросы