Java 使用Hibernate 3.6.3时获取ClassNotFoundException,并在Tomcat中添加了DefaultPreUpdateEventListener
我有一个问题,它已经使用Hibernate 3.6.0很长时间了(或者在这里的版本)。该项目自2009年开始开发,并且缓慢但肯定地升级了Hibernate版本。它已经使用3.6.x一段时间了 我试着升级到3.6.3,看看它是否解决了这个问题-它没有。我的测试仍在运行 我最近刚刚为DefaultPreUpdateEventListener创建了一个实现。当我在IntelliJ中进行单元测试时,它工作得非常好。当我在Maven中运行测试时,它就工作了。然而,当我在Tomcat中运行我的应用程序时,我得到了这个愚蠢的类路径错误:Java 使用Hibernate 3.6.3时获取ClassNotFoundException,并在Tomcat中添加了DefaultPreUpdateEventListener,java,hibernate,spring,exception,classloader,Java,Hibernate,Spring,Exception,Classloader,我有一个问题,它已经使用Hibernate 3.6.0很长时间了(或者在这里的版本)。该项目自2009年开始开发,并且缓慢但肯定地升级了Hibernate版本。它已经使用3.6.x一段时间了 我试着升级到3.6.3,看看它是否解决了这个问题-它没有。我的测试仍在运行 我最近刚刚为DefaultPreUpdateEventListener创建了一个实现。当我在IntelliJ中进行单元测试时,它工作得非常好。当我在Maven中运行测试时,它就工作了。然而,当我在Tomcat中运行我的应用程序时,我
Caused by: org.springframework.beans.factory.CannotLoadBeanClassException: Error loading class [trainingdividend.dao.UpdatedOnEventListener] for bean with name 'trainingdividend.dao.UpdatedOnEventListener#1342f5b' defined in file [C:\Users\egervari\IdeaProjects\trainingdividend-experiment\target\classes\applicationContext.xml]: problem with class file or dependent class; nested exception is java.lang.NoClassDefFoundError: org/hibernate/event/def/DefaultPreUpdateEventListener
at org.springframework.beans.factory.support.AbstractBeanFactory.resolveBeanClass(AbstractBeanFactory.java:1253)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:433)
at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveInnerBean(BeanDefinitionValueResolver.java:270)
... 118 more
Caused by: java.lang.NoClassDefFoundError: org/hibernate/event/def/DefaultPreUpdateEventListener
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClassCond(ClassLoader.java:632)
at java.lang.ClassLoader.defineClass(ClassLoader.java:616)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:141)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:283)
at java.net.URLClassLoader.access$000(URLClassLoader.java:58)
at java.net.URLClassLoader$1.run(URLClassLoader.java:197)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
at org.apache.catalina.loader.WebappClassLoader.findClass(WebappClassLoader.java:1026)
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1483)
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1361)
at org.springframework.util.ClassUtils.forName(ClassUtils.java:257)
at org.springframework.beans.factory.support.AbstractBeanDefinition.resolveBeanClass(AbstractBeanDefinition.java:408)
at org.springframework.beans.factory.support.AbstractBeanFactory.doResolveBeanClass(AbstractBeanFactory.java:1271)
at org.springframework.beans.factory.support.AbstractBeanFactory.resolveBeanClass(AbstractBeanFactory.java:1242)
... 120 more
Caused by: java.lang.ClassNotFoundException: org.hibernate.event.def.DefaultPreUpdateEventListener
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1516)
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1361)
... 136 more
这真的没有道理。到目前为止,我在运行Hibernate时没有遇到任何问题。没有一个为什么我现在突然有麻烦了?我的意思是,这在单元/集成测试中有效
我真的很讨厌这种问题。如果有人能帮忙,我将不胜感激。我花了两个小时试图找出到底是怎么回事,但我看没问题。我的maven依赖项看起来不错——它只加载了1个版本的Hibernate
在这种情况下,我希望我使用的是Rails。我怀疑他们是否能忍受这些废话
下面是我对Hibernate的spring配置:
<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="eventListeners">
<map>
<entry key="pre-update">
<bean class="trainingdividend.dao.UpdatedOnEventListener" />
</entry>
</map>
</property>
<property name="dataSource" ref="dataSource"/>
<property name="mappingResources">
<list>
<value>hibernate/coursetemplate.hbm.xml</value>
<value>hibernate/address.hbm.xml</value>
<value>hibernate/user.hbm.xml</value>
<value>hibernate/trainee.hbm.xml</value>
<value>hibernate/company.hbm.xml</value>
<value>hibernate/instructor.hbm.xml</value>
<value>hibernate/module.hbm.xml</value>
<value>hibernate/sysadmin.hbm.xml</value>
</list>
</property>
<property name="namingStrategy">
<bean class="org.hibernate.cfg.ImprovedNamingStrategy"/>
</property>
<property name="hibernateProperties">
<props>
<prop key="javax.persistence.validation.mode">none</prop>
<prop key="hibernate.dialect">${hibernate.dialect}</prop>
<prop key="hibernate.hbm2ddl.auto">${hibernate.hbm2ddl.auto}
</prop>
<prop key="hibernate.generate_statistics">false</prop>
<prop key="hibernate.show_sql">false</prop>
<prop key="hibernate.format_sql">true</prop>
<prop key="hibernate.cache.use_second_level_cache">false</prop>
<prop key="hibernate.cache.provider_class">
org.hibernate.cache.EhCacheProvider
</prop>
</props>
</property>
</bean>
hibernate/coursetemplate.hbm.xml
hibernate/address.hbm.xml
hibernate/user.hbm.xml
hibernate/trainee.hbm.xml
hibernate/company.hbm.xml
hibernate/讲师.hbm.xml
hibernate/module.hbm.xml
hibernate/sysadmin.hbm.xml
没有一个
${hibernate.dial}
${hibernate.hbm2ddl.auto}
假的
假的
真的
假的
org.hibernate.cache.EhCacheProvider
检查JAR是否包含在类路径中。尝试将jar放入tomcat库中
如果您使用自定义侦听器,您是否尝试在配置中显式添加事件侦听器
<event type="load">
<listener class="com.eg.MyLoadListener"/>
<listener class="org.hibernate.event.def.DefaultLoadEventListener"/>
</event>
或者你可以实现org.hibernate.event.PreUpdateEventListener如果你下载hibernate 3.6.3的源代码,你会发现这个类不存在。 因此,我怀疑,如果您使用hibernate 3.6.3中的类路径点重新编译TrainingRedividion.dao.UpdatedOnEventListener,您会发现它不起作用(老实说,我也检查了hibernate 3.3.2,但它也不存在)
您需要实现自己的PreUpdateEventListener接口案例——它确实存在。这是我首先看到的。我已经检查了我的maven依赖项。事实上,正确的罐子就在那里。我是说,我一直在运行Hibernate。它已经在那里很久了。它还在那里。它没有消失。我认为这是其中的一个错误,与它实际所说的内容无关。是否添加了新的自定义侦听器?我将在Spring中添加事件侦听器。我没有使用JPA-只是在常规hibernate中将org.hibernate.event.def.DefaultPreUpdateEventListener的另一个条目添加到侦听器类中,因此,即使在“maven clean”之后,也要实现org.hibernate.event.PreUpdateEventListener,而不是扩展DefaultPreUpdateEventListener,Maven在我运行所有测试时发现了这个类,尽管这个类对我来说并不存在。这就是让我绊倒的原因。我使用完全相同的pom.xml启动tomcat。。。但它没有起作用。当然,如果我在IDE中遇到这个错误,当我在Maven中运行测试时,我会在3秒钟内解决它。但它奏效了。这让我相信这是某种错误,而不是它所说的。事实上,我仍然不知道为什么Maven会运行这些测试。我不知道。它根本不应该运行它们——它应该失败。