【问题标题】:JSF Hibernate Connection EstablishmentJSF Hibernate 连接建立
【发布时间】:2014-01-14 17:13:35
【问题描述】:

我正在尝试使用休眠建立与我的数据库的连接。 该项目包括 JSF 2.1、Hibernate 3、Primefaces。 我让这个项目运行起来。但是当我将值输入到 usercreate.xhtml 并按添加时,出现堆栈跟踪中提到的错误。

包含的 Jar 文件是

usercreate.xhtml

<h:head>

</h:head>
<h:body>
    <h:form>
        <table>
            <tr>
                <td><h:outputLabel for="name" value="Name"/></td>
                <td><h:inputText id="name" value="#{userManagedBean.name}">

                </h:inputText></td>

            </tr>
            <tr>
                <td><h:outputLabel for="pwd" value="Password"/></td>
                <td><h:inputSecret id="pwd" value="#{userManagedBean.password}">

                </h:inputSecret></td>

            </tr>
            <tr>
                <td><h:outputLabel for="address" value="Address"/></td>
                <td><h:inputText id="address" value="#{userManagedBean.address}">

                </h:inputText></td>

            </tr>
            <tr>
                <p:commandButton id="add" value="Add" action="#{userManagedBean.addUser}"> </p:commandButton>
                <p:commandButton id="reset" value="Reset" action="#{userManagedBean.reset}"/>
            </tr>
        </table>

    </h:form>

</h:body>

托管 Bean

 public class UserManagedBean implements Serializable {
        private static final long serialVersionUID = 1L;
        private String name;
        private String password;
        private String address;
        private static final String SUCCESS = "success";
        private static final String ERROR   = "error";
//getter and setter of name, password, address included.

    public void addUser()
    {
        User u = new User();
        u.setName(name);
        u.setPwd(password);
        u.setAddress(address);

        String result = null;
        Session session = HibernateUtil.getSessionFactory().openSession();
        Transaction tx = null;
        try {
               tx = session.beginTransaction();
               session.save(u);
               tx.commit();
               result = SUCCESS;
          } catch (Exception e) {
               if (tx != null) {
                tx.rollback();
                result = ERROR;
                e.printStackTrace();
               }
              } finally {
               session.close();
              }

    }

}

用户模型

@Entity
@Table(name = "tbl_employee")
public class User {
    private String name;
    private String pwd;
    private String address;

    @Column(name="name")
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }

    @Column(name="pwd")
    public String getPwd() {
        return pwd;
    }
    public void setPwd(String pwd) {
        this.pwd = pwd;
    }

    @Column(name="address")
    public String getAddress() {
        return address;
    }
    public void setAddress(String address) {
        this.address = address;
    }
}

实用程序

public class HibernateUtil {

    private static SessionFactory sessionFactory = null;

    public static SessionFactory getSessionFactory() {
        if (sessionFactory == null) {
            sessionFactory = new Configuration().configure()
                    .buildSessionFactory();
        }
        return sessionFactory;
    }

    public static void setSessionFactory(SessionFactory sessionFactory) {
        HibernateUtil.sessionFactory = sessionFactory;
    }
}

休眠配置文件

<hibernate-configuration>
    <session-factory>
        <property name='hibernate.connection.driver_class'>com.mysql.jdbc.Driver</property>
        <property name='hibernate.connection.url'>jdbc:mysql://localhost:3306/db_employee_spring</property>
        <property name='hibernate.connection.username'>root</property>
        <property name='hibernate.connection.password'>root</property>
        <property name='hibernate.connection.pool_size'>10</property>
        <property name='show_sql'>true</property>
        <property name='dialect'>org.hibernate.dialect.MySQLDialect</property>
        <!-- Mapping files -->
        <!-- <mapping resource='hbm/user.hbm.xml' />-->
    </session-factory>
</hibernate-configuration>

堆栈跟踪

WARNING: #{userManagedBean.addUser}: java.lang.NoSuchFieldError: INSTANCE
javax.faces.FacesException: #{userManagedBean.addUser}: java.lang.NoSuchFieldError: INSTANCE
    at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:118)
    at javax.faces.component.UICommand.broadcast(UICommand.java:315)
    at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:794)
    at javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:1259)
    at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:81)
    at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
    at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118)
    at javax.faces.webapp.FacesServlet.service(FacesServlet.java:593)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:953)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1041)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:603)
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:312)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)
Caused by: javax.faces.el.EvaluationException: java.lang.NoSuchFieldError: INSTANCE
    at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:102)
    at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:102)
    ... 26 more
Caused by: java.lang.NoSuchFieldError: INSTANCE
    at org.hibernate.type.BasicTypeRegistry.<init>(BasicTypeRegistry.java:94)
    at org.hibernate.type.TypeResolver.<init>(TypeResolver.java:59)
    at org.hibernate.cfg.Configuration.<init>(Configuration.java:250)
    at org.hibernate.cfg.Configuration.<init>(Configuration.java:302)
    at com.sphc.util.HibernateUtil.getSessionFactory(HibernateUtil.java:12)
    at com.sphc.managedbeans.UserManagedBean.addUser(UserManagedBean.java:49)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at org.apache.el.parser.AstValue.invoke(AstValue.java:278)
    at org.apache.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:274)
    at com.sun.faces.facelets.el.TagMethodExpression.invoke(TagMethodExpression.java:105)
    at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:88)
    ... 27 more

我认为 addUser 方法中存在错误(我无法计算),因为我可以在单击 xhtml 中的添加按钮时访问 addUser 方法(通过 sysout)..

【问题讨论】:

  • 您是否尝试过从单元测试等中调用 adduser 代码?从堆栈跟踪来看,您的休眠配置可能有问题。您是否有相同项目的其他部分成功使用相同的休眠配置,或者它是一个新项目?
  • 您能发布您的实体文件或映射文件吗?给定 getter/setter 的注释可能存在错误。另外,action="@{userManagedBean.reset}" 中的 @ 看起来有点可疑......
  • @L-Ray :我的错误..我已将 @ 更改为 #..但错误仍然存​​在..我已在问题中添加了实体。由于使用了注解,所以没有使用映射文件。
  • @Matt:我已经包含了配置文件..它实际上是一个新项目..没有其他部分使用 Hibernate 配置。
  • 你好夏娃。好吧,看不出有什么问题。所以不会有太大帮助。愿 Entity 类现在吸引其他开发者来帮助你......

标签: hibernate jsf-2 primefaces


【解决方案1】:

将其放入答案中,因为有太多文字无法评论 Vinayak 的答案。

当您在不同的库/不同版本中拥有相同的类时,这种类转换异常非常常见。您很有可能遇到某种类加载器冲突,可以通过删除您不需要的任何库/使用正确版本来解决。

回顾我的一些旧休眠项目,我可以看到我使用了 hibernate-commons-annotations 但没有使用 hibernate-annotations(不确定这是否正确但对我有用)。

还值得看看您使用的是哪个版本的休眠;就我而言,我使用过(同样,不是说它完美但对我有用):

hibernate-core-3.6.5.Final.jar
hibernate-commons-annotations-3.2.0.Final.jar
hibernate-jpa-2.0-api-1.0.0.Final.jar
mysql-connector-java-5.1.6.jar

如果可以的话,我强烈建议您使用 Maven 来管理您的依赖项,因为只需添加几个库,所有正确的依赖项都将被引入。

您可以尝试的另一件事是使用 Winzip 或 7zip 之类的文件打开休眠 jar 文件,然后单击其中的文件夹结构以查看哪些包含类转换异常中提到的类 - 这至少会给您一个了解有问题的图书馆是什么。要记住的另一件事是,如果您将其部署到比嵌入式码头服务器更复杂的网络服务器上,那么网络服务器(例如 Tomcat?)很有可能也可以拥有自己的库,特别是如果有人把它们放在那里对于一个不同的项目(一个很大的禁忌,但我在原型设计时经常这样做)。

希望有帮助!!

【讨论】:

  • 我删除了 hibernate-annontations & hibernate-common-annotations jar , hibernate3.jar 并添加了 jta.jar & hibernate3.5.0final, hibernate-jpa-2.0-api-1.0.1.Final.jar文件。这有助于摆脱所有这些例外..:)..谢谢 2 Vinayak Matt L-Ray
【解决方案2】:

我在处理 JSF 时遇到了类似的问题。

你可以尝试的是:-

  1. 我不得不删除 hibernate-annotations.jar,因为我在 hibernate3.jar 中已经有了它。
  2. 在 L-Ray 建议的重置命令中。 @ 完全不能使用 #。

【讨论】:

  • 我尝试删除 hibernate-annotations.jar。但它产生了另一个例外。警告:#{userManagedBean.addUser}:java.lang.ClassCastException:org.hibernate.annotations.common.reflection.java.JavaReflectionManager 不能转换为 org.hibernate.annotations.common.reflection.MetadataProviderInjector javax.faces.FacesException:# {userManagedBean.addUser}: java.lang.ClassCastException: org.hibernate.annotations.common.reflection.java.JavaReflectionManager 无法转换为 org.hibernate.annotations.common.reflection.MetadataProviderInjector 所以我再次包含了那个 jar 文件。跨度>
猜你喜欢
  • 2014-10-16
  • 1970-01-01
  • 2016-04-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多