Как получить то же соединение с базой данных, что и JPA, использующий Java? - PullRequest
9 голосов
/ 02 ноября 2011

Я использую Jasper Reports для генерации отчетов.

Я использую временные таблицы для создания отчетов, для которых мне нужно то же соединение, которое используется JPA при создании временной таблицы, как мне добиться того же.

Ответы [ 2 ]

15 голосов
/ 13 ноября 2011

Вероятно, вы всего в трех шагах.

Вы можете сделать это следующим образом

  1. использовать источник данных JTA для файла persistance.xml, как показано ниже

    <persistence-unit name="sample">
            <jta-data-source>java:comp/env/jdbc/DBConnectionDS</jta-data-source>
            ....
    </persistence-unit>
    
  2. Для создания отчета извлеките connection из источника данных, как показано ниже

    InitialContext initialContext = new InitialContext();
    DataSource dataSource = (DataSource)initialContext.lookup("java:comp/env/jdbc/DBConnectionDS");
    Connection connection = dataSource.getConnection();
    
  3. Используйте соединение, чтобы сгенерировать отчет примерно так:

    JasperPrint print = JasperFillManager.fillReport(report, parameters, connection);
    

Это должно быть все, во что я верю. Идея состоит в том, чтобы использовать общее соединение JNDI для JPA и JasperReport, а затем использовать их там, где это применимо.

Я не работал с JasperReports, но работал с отчетом BIRT и решил это без проблем.

10 голосов
/ 02 ноября 2011

В JasperReports вы можете использовать как собственные JDBC-запросы, так и EJBQL-запросы.

При использовании последнего ваш код должен выглядеть следующим образом (из JRJpaQueryExecuter api):

 Map parameters = new HashMap();
 EntityManager em = emf.createEntityManager();
 parameters.put(JRJpaQueryExecuterFactory.PARAMETER_JPA_ENTITY_MANAGER, em);
 JasperRunManager.runReportToPdfFile(fileName, parameters);

Если вам действительно необходимо нижележащее соединение jdbc, способ его достижения зависит от используемой реализации JPA.

EclipseLink (JPA 2.0):

entityManager.getTransaction().begin();
java.sql.Connection connection = entityManager.unwrap(java.sql.Connection.class);
...
entityManager.getTransaction().commit();

(Вам не нужно начинать и фиксировать транзакции для отчетов)

...