问题描述
- 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>
解决方案
提供三个思路:
1. org.hibernate.service.ServiceRegistry是包org.hibernate.service中的一个方法,而org.hibernate.service包在hibernate-core-xx.jar中,你看一下hibernate-core-xxx.jar这个核心包有没有导入,不过这个可能性不大。
- 与struts结合时就出现问题,可能是jar包没有拷贝到WEB-INF/lib文件夹下,你可能使用UserLibary自己加的包,也就是说WEB-INF/lib下在部署时没有拷贝你的jar包进来,所以你可以尝试这样去解决:看这篇文章的方法:http://blog.csdn.net/eson_15/article/details/51281079
你将所有你自己添加的jar包全部选中即可。 - 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();
}
}
解决方案二:
忘了标2和3了,2是试试博客里提到的方法,你将自己添加的jar包全选中。 3是你试试我给你的获取sessionFactory的方法