2 z55887 z55887 于 2016.04.30 13:54 提问

hibernate4.3在servlet中的无法找到ServiceRegistry

如题,起初配置的hibernate5,通过servlet调用hibernateUtil生成session一切正常。
后来改成了hibernate4.3.11,并修改了对应的配置文件。
结果在main方法里面调用hibernateUtil,再进行操作一切正常。但如何通过servlet访问,会马上报:**java.lang.ClassNotFoundException: org.hibernate.service.ServiceRegistry**

这个问题百度了很久,网上也有类似的疑问,但没有一个正确解决了的,希望能够得到大神的帮助。
以下是异常和相关代码:

异常

java.lang.ClassNotFoundException: org.hibernate.service.ServiceRegistry
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1720)
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1571)
at findLose.backGroud.wsz.service.UserService.(UserService.java:32)
at findLose.backGroud.wsz.control.web.LoginControl.(LoginControl.java:34)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:526)
at java.lang.Class.newInstance(Class.java:379)
at org.apache.catalina.core.DefaultInstanceManager.newInstance(DefaultInstanceManager.java:116)
at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1148)
at org.apache.catalina.core.StandardWrapper.allocate(StandardWrapper.java:864)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:134)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:503)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:170)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:950)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:421)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1070)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:611)
at org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.doRun(AprEndpoint.java:2466)
at org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.run(AprEndpoint.java:2455)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Thread.java:745)

相关代码

 @WebServlet("/dologin.html")
public class LoginControl extends HttpServlet {
    UserService userService = new UserService();  //出错代码,这个里面调用了hibernateUtil来获取currentSession
        …………
    }
 public class HibernateUtil {

    private static SessionFactory sessionFactory;
    private static Session session;

    static {
        // 创建Configuration,该对象用于读取hibernate.cfg.xml,并完成初始化
        Configuration config = new Configuration().configure();
        StandardServiceRegistryBuilder ssrb = new StandardServiceRegistryBuilder()
                .applySettings(config.getProperties());
        ServiceRegistry ssr = ssrb.build();
        sessionFactory = config.buildSessionFactory(ssr);
    }

    /**
     * 获取SessionFactory
     * 
     * @return
     */
    public static SessionFactory getSessionFactory() {
        return sessionFactory;
    }

    public static Session getCurrentSession() {
        session = sessionFactory.openSession();
        return session;
    }

    public static void closeSession(Session session) {

        if (null != session) {
            session.close();
        }
    }
}

配置:

 <!DOCTYPE hibernate-configuration PUBLIC
    "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">

<hibernate-configuration>


        <session-factory>
        <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/findlose</property>
        <property name="hibernate.connection.username">root</property>
        <property name="hibernate.connection.password">123456</property>

        <!--方言-->
        <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
        <!-- ORM映射产生表的策略:update 实体和表的结构和数据 -->
        <property name="hibernate.hbm2ddl.auto">update</property>
        <!-- 产生的SQL语句显示 -->
        <property name="hibernate.show_sql">true</property>
        <!-- 产生的SQL语句格式化 -->
        <property name="hibernate.format_sql">true</property>
        <!-- 产生一个session在一个线程上 -->
        <property name="hibernate.current_session_context_class">thread</property>

        <!--罗列所有持久化类的类名 ,类名重复会抛异常,即使不在一个包下-->
        <mapping class="findLose.backGroud.wsz.entity.Face"/>
        <mapping class="findLose.backGroud.wsz.entity.Group"/>
        <mapping class="findLose.backGroud.wsz.entity.Person"/>
        <mapping class="findLose.backGroud.wsz.entity.User"/>

    </session-factory>
</hibernate-configuration>

2个回答

eson_15
eson_15   2016.05.04 20:14
已采纳

提供三个思路:
1. org.hibernate.service.ServiceRegistry是包org.hibernate.service中的一个方法,而org.hibernate.service包在hibernate-core-xx.jar中,你看一下hibernate-core-xxx.jar这个核心包有没有导入,不过这个可能性不大。

  1. 与struts结合时就出现问题,可能是jar包没有拷贝到WEB-INF/lib文件夹下,你可能使用UserLibary自己加的包,也就是说WEB-INF/lib下在部署时没有拷贝你的jar包进来,所以你可以尝试这样去解决:看这篇文章的方法:http://blog.csdn.net/eson_15/article/details/51281079
    你将所有你自己添加的jar包全部选中即可。

  2. hibernate4获取sessionFactory你试试下面的方法:

 public class HibernateUtil {

    private static SessionFactory sessionFactory;
    private static Session session;
        private static Configuration configuration = new Configuration();
    private static ServiceRegistry serviceRegistry; 

    static {
       try {
                        configuration.configure();
                        serviceRegistry = new ServiceRegistryBuilder().applySettings(configuration.getProperties()).buildServiceRegistry();
                        sessionFactory = configuration.buildSessionFactory(serviceRegistry);
            } catch (Exception e) {
                        System.err.println("%%%% Error Creating SessionFactory %%%%");
                        e.printStackTrace();
            }
    }
eson_15
eson_15 回复大树先生: 不客气
一年多之前 回复
z55887
z55887 后来找到了原因,的确是加在UserLibary里面的jar包myeclipse没有加载进去,谢谢了
一年多之前 回复
eson_15
eson_15   2016.05.04 20:16

忘了标2和3了,2是试试博客里提到的方法,你将自己添加的jar包全选中。 3是你试试我给你的获取sessionFactory的方法

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!