我正在使用spring,hibernate和jasperreports构建基于maven的web应用程序。
这是applicationContext.xml文件
<bean id="myDataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="${driverBinder}" />
<property name="url" value="${urlBinder}" />
<property name="username" value="${usernameBinder}" />
<property name="password" value="${passwordBinder}" />
</bean>
<bean id="mySessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
<property name="dataSource" ref="myDataSource"/>
<property name="annotatedClasses">
<list>
...
</list>
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">${dialectBinder}</prop>
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.hbm2ddl.auto">update</prop>
</props>
</property>
</bean>
生成报告的Java类
@Controller
public class DefaultGenerator extends AbstractView {
@Autowired
@Qualifier("mySessionFactory")
protected SessionFactory sessionFactory;
private static Session session;
private static Transaction transaction;
private static OutputStream outputStream;
private static JasperPrint jasperPrint;
@Override
protected void renderMergedOutputModel(Map<String, Object> model, HttpServletRequest request, HttpServletResponse response) throws Exception {
session = sessionFactory.openSession();
transaction = session.beginTransaction();
outputStream = response.getOutputStream();
HashMap parameters = (HashMap) model.get("parameters");
parameters.put(JRHibernateQueryExecuterFactory.PARAMETER_HIBERNATE_SESSION, session);
URL reportTemplate = getClass().getClassLoader().getResource("someFile.jrxml");
JasperReport jasperReport = JasperCompileManager.compileReport(reportTemplate.getPath());
jasperPrint = JasperFillManager.fillReport(jasperReport, parameters);
transaction.rollback();
session.close();
render(new JRPdfExporter());
}
private void render(Exporter exporter) throws JRException {
List<JasperPrint> jasperPrintList = new ArrayList<>();
jasperPrintList.add(jasperPrint);
exporter.setExporterInput(SimpleExporterInput.getInstance(jasperPrintList));
exporter.setExporterOutput(new SimpleOutputStreamExporterOutput(outputStream));
exporter.exportReport();
}
}
什么也没发生。我正在变成一个错误 - java.lang.NoSuchFieldError:BOOLEAN。 它也在这里描述 - http://community.jaspersoft.com/questions/536345/jasperreports-376-and-hibernate-36-errors 看起来自Hibernate的3.6版以后就有类BOOLEAN了。但jasperreports尝试使用它......
任何人都可以帮助我,并告诉我如何尽可能地做到这一点吗?我正在使用Maven,所以我的队友可能会更新一次库,所以我不想重新编译jasperreports库。
感谢。
答案 0 :(得分:0)
喜欢写在这里http://jasperreports.sourceforge.net/sample.reference/hibernate/
其中一个专门用于数据访问的中间层工具是Hibernate(今天:Hibernate 3.3)(...)
...最新的jasperreports 5.6是否有可能认为hibernate的实际版本是3.3而不是4.3? OO
两个星期的解决方案,没有任何事情:/
答案 1 :(得分:0)
来自jasperreports 5.6.0 pom
...
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate</artifactId>
<version>3.0.5</version>
<scope>compile</scope>
<exclusions>
<exclusion>
<groupId>javax.transaction</groupId>
<artifactId>jta</artifactId>
</exclusion>
</exclusions>
<optional>true</optional>
</dependency>
...
它确实带来了休眠3。
这是JasperReports 5.6.0中一个类的片段,其中jasperreports试图找到hibernate.BOOLEAN类。
import org.hibernate.Hibernate;
import org.hibernate.Query;
import org.hibernate.ScrollMode;
import org.hibernate.ScrollableResults;
import org.hibernate.Session;
import org.hibernate.type.Type;
/**
* HQL query executer that uses Hibernate 3.
*
* @author Lucian Chirita (lucianc@users.sourceforge.net)
* @version $Id: JRHibernateQueryExecuter.java 7199 2014-08-27 13:58:10Z teodord $
*/
public class JRHibernateQueryExecuter extends JRAbstractQueryExecuter
{
private static final Log log = LogFactory.getLog(JRHibernateQueryExecuter.class);
protected static final String CANONICAL_LANGUAGE = "HQL";
private static final Map<Class<?>,Type> hibernateTypeMap;
static
{
hibernateTypeMap = new HashMap<Class<?>,Type>();
hibernateTypeMap.put(Boolean.class, Hibernate.BOOLEAN);
hibernateTypeMap.put(Byte.class, Hibernate.BYTE);
hibernateTypeMap.put(Double.class, Hibernate.DOUBLE);
hibernateTypeMap.put(Float.class, Hibernate.FLOAT);
hibernateTypeMap.put(Integer.class, Hibernate.INTEGER);
...
只要您尝试使用该版本的JRHibernateQueryExecutor,您将被限制为Hibernate 3.0。
在这里,您可以在JasperReports开发树中看到history of JRHibernateQueryExecutor。
我相信你需要this change才能支持更新的hibernate版本。
该变更于2015年6月提交。
如果你看看mvnrepository.com上的history of the jasperreports releases,你会发现6.1.1是maven的第一个版本,可能包含你需要使用更新版本的hibernate所需的更改。
我刚尝试使用5.6.0(以及6.1.0)与Hibernate 4并重复您的错误。然后我尝试使用6.1.1并且该错误消失了。