JBOSS eap 7.0无法在JPA查询

时间:2017-06-15 22:32:19

标签: java hibernate jpa jboss

enter image description here我有一个在JBOSS AS 6.1中工作的EAR项目(JSF / RICH FACES,JPA 2.0),我必须迁移到JBOSS EAP 7.0。在部署时,我在创建持久性单元期间会出现以下错误。

**"[PersistenceUnit: changecdb] Unable to build Hibernate SessionFactory
    Caused by: javax.persistence.PersistenceException: [PersistenceUnit: changecdb] Unable to build Hibernate SessionFactory
    Caused by: org.hibernate.HibernateException: Errors in named queries: getSubReports, getAllReports"}}}} "**

日志显示以下错误:

**"ERROR [org.hibernate.internal.SessionFactoryImpl] (ServerService Thread Pool -- 101) HHH000177: Error in named query: getSubReports: org.hibernate.hql.internal.ast.QuerySyntaxException: Unable to locate class [javax.faces.model.SelectItem] [select new javax.faces.model.SelectItem(r.id,r.name) from com.centurylink.changecejb.entity.Report r where r.id<>? order by r.name asc]
        at org.hibernate.hql.internal.ast.QuerySyntaxException.convert(QuerySyntaxException.java:74)
"**

以下是包含命名查询的源文件:

package com.centurylink.changecejb.entity;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.NamedQuery;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;

import javax.persistence.NamedQueries;

@SequenceGenerator(name="reportSequence",sequenceName="rep_seq")
@Entity
@NamedQueries({@NamedQuery(name="getAllCustomReports",query="select new com.centurylink.changecejb.bean.SelectBean(r.id,r.name) from Report r order by r.name asc")
,@NamedQuery(name="getCustomReportForAId",query="from Report r where r.id=? ")
,@NamedQuery(name="getSubReports",query="select new javax.faces.model.SelectItem(r.id,r.name) from Report r where r.id<>? order by r.name asc"),
@NamedQuery(name="getAllReports",query="select new javax.faces.model.SelectItem(r.id,r.name) from Report r order by r.name asc"),
@NamedQuery(name="updateCustomReport",query="update Report r  set r.name=:name where r.id=:id")

,@NamedQuery(name="deleteCustomReport",query="delete Report report where report.id=:id")})
@Table(name="report_table")
public class Report {
    private String filename;
    private String name;
    @Id
    @GeneratedValue(generator="reportSequence",strategy=GenerationType.SEQUENCE)
    private int id;
public String getFilename() {
        return filename;
    }
    public void setFilename(String filename) {
        this.filename = filename;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }

}

我没有包含JSF api和impl,我确实尝试将这些包含在我的lib文件夹中但仍然得到相同的错误。 请帮忙

更新:

以下是我的图书馆清单:

common-annotations.jar
commons-beanutils.jar
commons-collections.jar
commons-digester.jar
commons-logging.jar
cssparser-0.9.5.jar
guava-10.0.1.jar
guava-gwt-10.0.1.jar
jsonplugin-0.32.jar
jstl.jar
poi-3.6-20091214.jar
richfaces-components-api-4.2.0.Final.jar
richfaces-components-ui-4.2.0.Final.jar
richfaces-core-api-4.2.0.Final.jar
richfaces-core-impl-4.2.0.Final.jar
sac-1.3.jar
standard.jar

下面是我的persistence.xml:

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">

    <persistence-unit name="changecdb" transaction-type="JTA">
        <provider>org.hibernate.ejb.HibernatePersistence</provider>
        <jta-data-source>java:jboss/datasources/changec</jta-data-source>
        <class>com.centurylink.changecejb.entity.Report</class>

    </persistence-unit>
</persistence>

我想知道是否由于EAP 7.0具有Hibernate 5.0而AS6.1具有Hibernate 3.6和/或JSF 2.2 vs JSF 1.2

更新: 在接受Gabriel的回答后,我搜索了EAP 7库,发现已经提供了一半的库。我从我的LIB删除了已经由EAP 7提供的库,但我仍然得到同样的错误。 出于某种原因,HIBERNATE 5.0并不适合加载该类 的 javax.faces.model.SelectItem

我验证该类存在于jaxax / faces模块下的一个EAP 7.0库中 jboss-jsf-api_2.2_spec-2.2.12.redhat-1.jar

以下是我当前的lib文件夹内容:

commons-digester.jar
commons-logging.jar
cssparser-0.9.5.jar
jsonplugin-0.32.jar
poi-3.6-20091214.jar
richfaces-components-api-4.2.0.Final.jar
richfaces-components-ui-4.2.0.Final.jar
richfaces-core-api-4.2.0.Final.jar
richfaces-core-impl-4.2.0.Final.jar
sac-1.3.jar

作为一种解决方法,我正在考虑提供自己的JSF(1.2)以及Hibernate(3.6)库,并在standalone.xml中禁用EAP。

欢迎任何其他想法/建议。

1 个答案:

答案 0 :(得分:0)

它可能是与类路径相关的问题,可能会加载同一类的两个版本。 检查您的战争中是否包含服务器提供的jar。 你可以添加你的库设置吗?

我看到你有平台提供的jstl.jar和standard.jar。不确定这些罐子是否包含有问题的类,但无论如何你需要删除它们。

<强>更新

据我所知,JBoss EAP应该符合JEE6标准,因此它应该使用JSF 2.0,并且迁移到JBoss EAP(符合JEE7的JSF 2.2)应该是轻松的。

但是你指出你使用的是JSF 1.2,我猜你正在使用JBoss EAP 6中的兼容模式,如blog所述。

似乎Wildfly / JBoss EAP 7不再支持JSF 1.2,请查看this page以获取有关如何添加自定义JSF版本的说明。