gpt4 book ai didi

java - 使用 Hibernate 3.6.3 时获取 ClassNotFoundException 并且刚刚在 Tomcat 中添加了 DefaultPreUpdateEventListener

转载 作者:行者123 更新时间:2023-11-30 11:54:19 24 4
gpt4 key购买 nike

我有一个问题,一直在使用 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 时完全没有问题。没有任何。为什么突然间我遇到了 jar hell 问题?我的意思是,这适用于单元/集成测试!

我真的很讨厌这类问题。如果有人能提供帮助,我将不胜感激。我花了 2 个小时试图找出发生了什么,但我认为没有问题。我的 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>

最佳答案

检查 jars 是否包含在类路径中。尝试将 jar 放入 tomcat 库中。

如果您使用自定义监听器,您是否尝试过在配置中显式添加事件监听器?

<event type="load">
<listener class="com.eg.MyLoadListener"/>
<listener class="org.hibernate.event.def.DefaultLoadEventListener"/>
</event>

或者你可以实现org.hibernate.event.PreUpdateEventListener

关于java - 使用 Hibernate 3.6.3 时获取 ClassNotFoundException 并且刚刚在 Tomcat 中添加了 DefaultPreUpdateEventListener,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5771647/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com