【问题标题】:How to get the same database connection as JPA used using Java?如何获得与使用 Java 使用的 JPA 相同的数据库连接?
【发布时间】:2011-12-20 02:24:12
【问题描述】:

我正在使用 Jasper Reports 生成报告。

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

【问题讨论】:

  • 您的 JPA 是否设置为使用数据源?

标签: java jpa jasper-reports database-connection datasource


【解决方案1】:

也许你只有三步之遥。

您可以使用以下方式进行操作

  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);
    

这应该就是我所相信的。这个想法是,为 JPA 和 JasperReport 使用通用 JNDI 连接,然后在适用的情况下使用它们。

我没有使用 JasperReports,但使用 BIRT Report 并以这种方式解决了它,没有任何问题。

【讨论】:

    【解决方案2】:

    在 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();
    

    (您无需开始和提交交易以进行报告)

    【讨论】:

      猜你喜欢
      • 2017-12-14
      • 2013-08-07
      • 2015-01-06
      • 1970-01-01
      • 2013-09-16
      • 1970-01-01
      • 1970-01-01
      • 2011-10-21
      • 2021-07-15
      相关资源
      最近更新 更多