使用HibernateTemplate时发生java.lang.NoClassDefFoundError [英] java.lang.NoClassDefFoundError while using HibernateTemplate

查看:146
本文介绍了使用HibernateTemplate时发生java.lang.NoClassDefFoundError的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我试图了解Spring-Hibernate环境中HibernateTemplate的工作。由于我是HibernateTemplate的新手,我很难理解这些错误。在我的项目中,我使用了 spring-framework-4.0.3 hibernate-4.3.5 中的所有jar文件。这个项目中使用的一些额外的jar包括:

$ p code $ cglib-nodep-2.1.3.jar
* commons-logging.jar
* ojdbc14.jar
* tomcat-dbcp-7.0.30.jar

使用以下java / xml文件:

StudentDaoInterface.java

  package dao; 

import java.util.List;

import model.Student;

public interface StudentDaoInterface {

public int save(Student st);
public boolean update(Student st);
public boolean delete(Student st);
public Student findbyPK(int pk);
public List< Student> findAllUsingHQL();
public List< Student> findAllUsingCriteria();


StudentDaoImplHT.java

  package dao; 

import java.util.List;

import org.hibernate.criterion.DetachedCriteria;
import org.springframework.orm.hibernate4.HibernateTemplate;

import model.Student;

公共类StudentDaoImplHT实现StudentDaoInterface {

私有HibernateTemplate ht;

public void setHt(HibernateTemplate ht){
this.ht = ht;


@Override
public int save(Student st){
int i =(Integer)ht.save(st);
返回i;
}

@Override
public boolean update(Student st){
ht.update(st);
返回true;


@Override
public boolean delete(Student st){
ht.delete(st);
返回true;

$ b @Override
public Student findbyPK(int pk){
Student st =(Student)ht.get(Student.class,pk);
return st;
}

@覆盖
公共列表< Student> findAllUsingHQL(){
List list = ht.find(from student);
返回列表;
}

@覆盖
公共列表< Student> findAllUsingCriteria(){
DetachedCriteria dc = DetachedCriteria.forClass(Student.class);
List list = ht.findByCriteria(dc);
返回列表;
}

}

Student.java

package model;

import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity
@Table(name =student,schema =system)
public class Student {

@Id
private int id;
私人字符串名称;
私人字符串电子邮件;
私有字符串地址;
$ b $ public Student(int id,String name,String email,String address){
super();
this.id = id;
this.name = name;
this.email =电子邮件;
this.address = address;
}

public void setId(int id){
this.id = id;
}

public void setName(String name){
this.name = name;
}

public void setEmail(String email){
this.email = email;
}

public void setAddress(String address){
this.address = address;
}

}

test.xml

 <?xml version =1.0encoding =UTF-8?> 
< beans
xmlns =http://www.springframework.org/schema/beans
xmlns:xsi =http://www.w3.org/2001/XMLSchema -instance
xmlns:p =http://www.springframework.org/schema/p
xsi:schemaLocation =http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.0.xsd\">
< bean id =bdsclass =org.apache.tomcat.dbcp.dbcp.BasicDataSource>
< property name =driverClassNamevalue =oracle.jdbc.OracleDriver/>
< property name =urlvalue =jdbc:oracle:thin:@localhost:1521:xe/>
< property name =usernamevalue =system/>
< property name =passwordvalue =manager/>
< property name =maxActivevalue =15/>
< property name =maxIdlevalue =5/>
< property name =maxWaitvalue =5000/>
< / bean>

< bean id =sfclass =org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean>
< property name =dataSourceref =bds/>
< property name =hibernateProperties>
<道具>
< prop key =hibernate.dialect> org.hibernate.dialect.OracleDialect< / prop>
< prop key =hibernate.hbm2ddl.auto> update< / prop>
< prop key =hibernate.show_sql> true< / prop>
< /道具>
< / property>
< property name =annotatedClasses>
< list>
< value> model.Student< / value>
< / list>
< / property>
< / bean>

< bean id =htclass =org.springframework.orm.hibernate4.HibernateTemplate>
< property name =sessionFactoryref =sf/>
< / bean>

< bean id =daoclass =dao.StudentDaoImplHT>
< property name =htref =ht/>
< / bean>

< / beans>

SaveClient.java

  package test; 

import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

导入dao.StudentDaoInterface;
import model.Student;

public class SaveClient {


public static void main(String [] args){
ConfigurableApplicationContext cap = new ClassPathXmlApplicationContext(resources / test。 XML);
StudentDaoInterface dao =(StudentDaoInterface)cap.getBean(dao);
学生st =新生(222,bbb,bbb@gmail.com,hyd);
dao.save(st);
System.out.println(success);
cap.close();
}


}

运行后代码 SaveClient.java 我遇到以下错误: $ b

  Dec 17, 2017 9:27:52 AM org.springframework.context.support.AbstractApplicationContext prepareRefresh 
INFO:刷新org.springframework.context.support.ClassPathXmlApplicationContext@3f8f9dd6:启动日期[Sun Dec 17 09:27:52 IST 2017] ;上下文层次结构的根
2017年12月17日上午9:27:52 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
INFO:从类路径资源加载XML bean定义[resources / test.xml ]
线程main中的异常org.springframework.beans.factory.BeanCreationException:在类路径资源[resources / test.xml]中定义名称为'sf'的Bean时出错:bean初始化失败;嵌套异常是java.lang.NoClassDefFoundError:[Lorg / hibernate / engine / FilterDefinition;在org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:547)

在org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:475)
,位于org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:228)处,

at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:300)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:195 )
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:684)
at org.springframework.context.support.AbstractApplicationContext.finishBeanFac toryInitialization(AbstractApplicationContext.java:760)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:482)
at org.springframework.context.support.ClassPathXmlApplicationContext。< init> (ClassPathXmlApplicationContext.java:139)
at org.springframework.context.support.ClassPathXmlApplicationContext。< init>(ClassPathXmlApplicationContext.java:83)
at test.SaveClient.main(SaveClient.java:13)
导致:java.lang.NoClassDefFoundError:[Lorg / hibernate / engine / FilterDefinition;
at java.lang.Class.getDeclaredMethods0(Native Method)
at java.lang.Class.privateGetDeclaredMethods(Unknown Source)
at java.lang.Class.privateGetPublicMethods(Unknown Source)
at java.lang.Class.privateGetPublicMethods(Unknown Source)$ b $ at java.lang.Class.getMethods(Unknown Source)
at org.springframework.beans.ExtendedBeanInfoFactory.supports(ExtendedBeanInfoFactory.java:54 )
at org.springframework.beans.ExtendedBeanInfoFactory.getBeanInfo(ExtendedBeanInfoFactory.java:46)
at org.springframework.beans.CachedIntrospectionResults。< init>(CachedIntrospectionResults.java:275)
在org.springframework.beans.CachedIntrospectionResults.forClass(CachedIntrospectionResults.java:188)
at org.springframework.beans.BeanWrapperImpl.getCachedIntrospectionResults(BeanWrapperImpl.java:327)
at org.springframework.beans.BeanWrapperImpl .getPropertyDescriptorInternal(BeanWrapperImpl.java:359)
at org.spr在org.springframework.beans中
(org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1458))

org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:537)
... 11 more
导致:java.lang.ClassNotFoundException:org.hibernate.engine.FilterDefinition $ b $在java.net.URLClassLoader.findClass(未知源)
在java.lang.ClassLoader.loadClass(未知源)
at sun.misc.Launcher $ AppClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
... 26 more


解决方案

您应该使用 org.springframework.orm.hibernate4.LocalSessionFactoryBean 而不是 org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean 。但在它指出以下内容,所以要小心你的Spring版本或者将你的Hibernate从4.3.5中减少。到4.2或4.1,如文档建议。



LocalSessionFactoryBean的这种变体需要Hibernate 4.0或更高版本。请注意,这个版本与(重构的)Hibernate 4.3不兼容;请升级到 Spring 4.0版本以获得完整的Hibernate 4.3支持。我们建议在最新的Hibernate 4.1.x或4.2.x 版本中使用此版本。


I was trying to understand the working of HibernateTemplate in Spring-hibernate environment. Since I am new to HibernateTemplate, I feel difficult to understand the errors. In my project I have used all the jar files availabe in spring-framework-4.0.3 and hibernate-4.3.5. Some of the additional jars used in this project are:

*cglib-nodep-2.1.3.jar
*commons-logging.jar
*ojdbc14.jar
*tomcat-dbcp-7.0.30.jar

Following java/xml files were used :

StudentDaoInterface.java

package dao;

import java.util.List;

import model.Student;

public interface StudentDaoInterface {

    public int save(Student st);
    public boolean update(Student st);
    public boolean delete(Student st);
    public Student findbyPK(int pk);
    public List<Student> findAllUsingHQL();
    public List<Student> findAllUsingCriteria();

}

StudentDaoImplHT.java

package dao;

import java.util.List;

import org.hibernate.criterion.DetachedCriteria;
import org.springframework.orm.hibernate4.HibernateTemplate;

import model.Student;

public class StudentDaoImplHT implements StudentDaoInterface {

    private HibernateTemplate ht;

    public void setHt(HibernateTemplate ht) {
        this.ht = ht;
    }

    @Override
    public int save(Student st) {
        int i=(Integer)ht.save(st);
        return i;
    }

    @Override
    public boolean update(Student st) {
        ht.update(st);
        return true;
    }

    @Override
    public boolean delete(Student st) {
        ht.delete(st);
        return true;
    }

    @Override
    public Student findbyPK(int pk) {
        Student st = (Student)ht.get(Student.class,pk);
        return st;
    }

    @Override
    public List<Student> findAllUsingHQL() {
        List list = ht.find("from student"); 
        return list;
    }

    @Override
    public List<Student> findAllUsingCriteria() {
        DetachedCriteria dc = DetachedCriteria.forClass(Student.class);
        List list = ht.findByCriteria(dc);
        return list;
    }

}

Student.java

package model;

import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity
@Table(name="student",schema="system")
public class Student {

    @Id
    private int id;
    private String name;
    private String email;
    private String address;

    public Student(int id, String name, String email, String address) {
        super();
        this.id = id;
        this.name = name;
        this.email = email;
        this.address = address;
    }

    public void setId(int id) {
        this.id = id;
    }

    public void setName(String name) {
        this.name = name;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public void setAddress(String address) {
        this.address = address;
    }

}

test.xml

<?xml version="1.0" encoding="UTF-8"?>  
<beans  
    xmlns="http://www.springframework.org/schema/beans"  
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
    xmlns:p="http://www.springframework.org/schema/p"  
    xsi:schemaLocation="http://www.springframework.org/schema/beans  
        http://www.springframework.org/schema/beans/spring-beans-4.0.xsd">  
    <bean id="bds" class="org.apache.tomcat.dbcp.dbcp.BasicDataSource">
        <property name="driverClassName" value="oracle.jdbc.OracleDriver"/>
        <property name="url" value="jdbc:oracle:thin:@localhost:1521:xe"/>
        <property name="username" value="system"/>
        <property name="password" value="manager"/>
        <property name="maxActive" value="15"/>
        <property name="maxIdle" value="5"/>
        <property name="maxWait" value="5000"/>
    </bean>

    <bean id="sf" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
        <property name="dataSource" ref="bds" />
        <property name="hibernateProperties">
            <props>
                <prop key="hibernate.dialect">org.hibernate.dialect.OracleDialect</prop>
                <prop key="hibernate.hbm2ddl.auto">update</prop>
                <prop key="hibernate.show_sql">true</prop>
            </props>
        </property>
        <property name="annotatedClasses">
            <list>
                <value>model.Student</value>
            </list>
        </property>
    </bean>

    <bean id="ht" class="org.springframework.orm.hibernate4.HibernateTemplate">
        <property name="sessionFactory" ref="sf" />
    </bean>

    <bean id="dao" class="dao.StudentDaoImplHT">
        <property name="ht" ref="ht" />
    </bean>

</beans>

SaveClient.java

package test;

import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import dao.StudentDaoInterface;
import model.Student;

public class SaveClient {


    public static void main(String[] args){
        ConfigurableApplicationContext cap = new ClassPathXmlApplicationContext("resources/test.xml");
        StudentDaoInterface dao = (StudentDaoInterface)cap.getBean("dao");
        Student st = new Student(222,"bbb","bbb@gmail.com","hyd");      
        dao.save(st);
        System.out.println("success");
        cap.close();
    }


}

After running the code SaveClient.java I face following errors:

Dec 17, 2017 9:27:52 AM org.springframework.context.support.AbstractApplicationContext prepareRefresh
INFO: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@3f8f9dd6: startup date [Sun Dec 17 09:27:52 IST 2017]; root of context hierarchy
Dec 17, 2017 9:27:52 AM org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
INFO: Loading XML bean definitions from class path resource [resources/test.xml]
Exception in thread "main" org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sf' defined in class path resource [resources/test.xml]: Initialization of bean failed; nested exception is java.lang.NoClassDefFoundError: [Lorg/hibernate/engine/FilterDefinition;
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:547)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:475)
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:304)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:228)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:300)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:195)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:684)
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:760)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:482)
    at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:139)
    at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:83)
    at test.SaveClient.main(SaveClient.java:13)
Caused by: java.lang.NoClassDefFoundError: [Lorg/hibernate/engine/FilterDefinition;
    at java.lang.Class.getDeclaredMethods0(Native Method)
    at java.lang.Class.privateGetDeclaredMethods(Unknown Source)
    at java.lang.Class.privateGetPublicMethods(Unknown Source)
    at java.lang.Class.privateGetPublicMethods(Unknown Source)
    at java.lang.Class.getMethods(Unknown Source)
    at org.springframework.beans.ExtendedBeanInfoFactory.supports(ExtendedBeanInfoFactory.java:54)
    at org.springframework.beans.ExtendedBeanInfoFactory.getBeanInfo(ExtendedBeanInfoFactory.java:46)
    at org.springframework.beans.CachedIntrospectionResults.<init>(CachedIntrospectionResults.java:275)
    at org.springframework.beans.CachedIntrospectionResults.forClass(CachedIntrospectionResults.java:188)
    at org.springframework.beans.BeanWrapperImpl.getCachedIntrospectionResults(BeanWrapperImpl.java:327)
    at org.springframework.beans.BeanWrapperImpl.getPropertyDescriptorInternal(BeanWrapperImpl.java:359)
    at org.springframework.beans.BeanWrapperImpl.isWritableProperty(BeanWrapperImpl.java:438)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1458)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1197)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:537)
    ... 11 more
Caused by: java.lang.ClassNotFoundException: org.hibernate.engine.FilterDefinition
    at java.net.URLClassLoader.findClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    ... 26 more

解决方案

You should use org.springframework.orm.hibernate4.LocalSessionFactoryBean instead of org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean. But in doc, it says that the following, so be careful about your Spring version or decrease your Hibernate from 4.3.5. to 4.2 or 4.1 as documentation suggests.

This variant of LocalSessionFactoryBean requires Hibernate 4.0 or higher. Note that this version is not compatible with the (the quite refactored) Hibernate 4.3 yet; please upgrade to the Spring 4.0 line for full Hibernate 4.3 support. We recommend using this version with the latest Hibernate 4.1.x or 4.2.x releases.

这篇关于使用HibernateTemplate时发生java.lang.NoClassDefFoundError的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆