如何获得与使用Java的JPA相同的数据库连接?

Rin*_*eri 9 java database-connection jpa datasource jasper-reports

我正在使用Jasper Reports来生成报告.

我正在使用临时表生成报告,我需要JPA使用相同的连接,同时创建临时表我如何实现相同.

Kow*_*ser 15

可能你只有三步之遥.

您可以使用以下方式执行此操作

  1. 使用JTA数据源作为persistance.xml,如下所示

    <persistence-unit name="sample">
            <jta-data-source>java:comp/env/jdbc/DBConnectionDS</jta-data-source>
            ....
    </persistence-unit>
    
    Run Code Online (Sandbox Code Playgroud)
  2. 对于报告生成,请检索connectionfrom数据源,如下所示

    InitialContext initialContext = new InitialContext();
    DataSource dataSource = (DataSource)initialContext.lookup("java:comp/env/jdbc/DBConnectionDS");
    Connection connection = dataSource.getConnection();
    
    Run Code Online (Sandbox Code Playgroud)
  3. 使用连接生成如下所示的报告:

    JasperPrint print = JasperFillManager.fillReport(report, parameters, connection);
    
    Run Code Online (Sandbox Code Playgroud)

这应该是我所相信的全部.我们的想法是,使用JPA和JasperReport的通用JNDI连接,然后在适用的地方使用它们.

我没有使用JasperReports,但是使用BIRT报告并且没有任何问题地解决了这个问题.


Mar*_*uri 10

在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);
Run Code Online (Sandbox Code Playgroud)

如果您确实需要底层jdbc连接,那么实现它的方式会因您使用的JPA实现而异.

EclipseLink(JPA 2.0):

entityManager.getTransaction().begin();
java.sql.Connection connection = entityManager.unwrap(java.sql.Connection.class);
...
entityManager.getTransaction().commit();
Run Code Online (Sandbox Code Playgroud)

(您不需要为报告开始和提交事务)