【问题标题】:NoClassDefFoundExpetion: javax/persistence/PersistenceContext Spring ORM with HibernateNoClassDefFoundExpetion: javax/persistence/PersistenceContext Spring ORM with Hibernate
【发布时间】:2016-08-31 11:51:15
【问题描述】:

我是春天的新手。我正在从javapoint 学习spring。在从javapointspring docs 学习了一些spring 的基础知识后,我转向使用spring 学习hibernate,但在第一次尝试(示例)时,我坚持使用例外:NoClassDefFoundExpetion: javax/persistence/PersistenceContext。为了解决这个异常,我在 thisthis 上搜索并寻找类似的情况(及其解决方案),但没有任何帮助。
Here 是我的异常的完整 stacktrace:

    Exception in thread "main" org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.context.annotation.internalPersistenceAnnotationProcessor': Instantiation of bean failed; nested exception is java.lang.NoClassDefFoundError: javax/persistence/PersistenceContext
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateBean(AbstractAutowireCapableBeanFactory.java:1105)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1050)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:510)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:482)
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:202)
    at org.springframework.context.support.PostProcessorRegistrationDelegate.registerBeanPostProcessors(PostProcessorRegistrationDelegate.java:207)
    at org.springframework.context.support.AbstractApplicationContext.registerBeanPostProcessors(AbstractApplicationContext.java:697)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:526)
    at org.springframework.context.annotation.AnnotationConfigApplicationContext.<init>(AnnotationConfigApplicationContext.java:84)
    at test.Test.main(Test.java:15)
Caused by: java.lang.NoClassDefFoundError: javax/persistence/PersistenceContext
    at org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor.<clinit>(PersistenceAnnotationBeanPostProcessor.java:172)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
    at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:142)
    at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:89)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateBean(AbstractAutowireCapableBeanFactory.java:1098)
    ... 12 more

我正在使用eclipse-neon IDE、spring-framework 4.3.2 RELEASEHibernate-5.2.2 FinalOracle 10G(数据库)。我的数据库中有一个 STUDENT 表,其中包含 4-5 个条目。我还使用简单(控制台基础)java projectNOT 使用任何构建工具编写了spring 代码。 Here 是我目前正在使用的完整代码和库列表:

Student.java

public class Student {

    private Integer rollNo;
    private String name;
    /**
     * @param rollNo
     * @param name
     */
    public Student(Integer rollNo, String name) {
        super();
        this.rollNo = rollNo;
        this.name = name;
    }

//Getter and setter ....

StudentDAO.java

public class StudentDAO {

    private HibernateTemplate hibernateTemplate;

    public StudentDAO(HibernateTemplate hibernateTemplate) {
        this.hibernateTemplate = hibernateTemplate;

    }

    public void setHibernateTemplate(HibernateTemplate template) {
        this.hibernateTemplate = template;
    }

    public void saveStudent(Student student) {
        hibernateTemplate.save(student);
    }

    public List<Student> readAll() {
        return hibernateTemplate.loadAll(Student.class);
    }
}

我正在使用基于 java 注释的配置,所以我的 AppConfig.java 是:

@Configuration
public class AppConfig {

    @Bean
    public DriverManagerDataSource dataSource() {
        DriverManagerDataSource dataSource = new DriverManagerDataSource("jdbc:oracle:thin:@localhost:1521/xe", "user", "password");
        dataSource.setDriverClassName("oracle.jdbc.driver.OracleDriver");
        return dataSource;
    }

    @Bean 
    public LocalSessionFactoryBean sessionFactoryBean() {
        LocalSessionFactoryBean bean = new LocalSessionFactoryBean();
        bean.setDataSource(dataSource());
        bean.setMappingResources("xml/student.hbm.xml");
        Properties prop = new Properties();
        prop.setProperty("hibernate.dialect", "org.hibernate.dialect.Oracle9Dialect");
        prop.setProperty("hibernate.hbm2ddl.auto", "update");
        prop.setProperty("hibernate.show_sql", "true");
        bean.setHibernateProperties(prop);
        return bean;
    }

    @Bean
    public HibernateTemplate hibernateTemplate() {
        HibernateTemplate template = new HibernateTemplate((SessionFactory) sessionFactoryBean());
        return template;
    }

    @Bean
    public StudentDAO DAO() {
        return new StudentDAO(hibernateTemplate());
    }

}

Student.hbm.xml XML 文件:

<?xml version='1.0' encoding='UTF-8'?>  
<!DOCTYPE hibernate-mapping PUBLIC  
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"  
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping>
                <class name="bean.Student" table="student">
                                <rollNo name="rollNo">
                                                <generator class="assigned"></generator>
                                </rollNo>
                                <property name="name"></property>
                </class>

</hibernate-mapping>

这是我的 Main-Method 类

public class Test {

    public static void main(String[] args) {
            ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
            StudentDAO dao = context.getBean(StudentDAO.class);
            List<Student> list = dao.readAll();
            for(Student s: list) 
                System.out.println(s);
    }

}

这是我在项目中包含的库(带有 jar 文件)的列表:

春天

休眠

Commons loggingORALCE 10G 驱动程序

还有一些其他

如何解决上述异常,library 我必须添加/删除或者我可以尝试解决问题的其他方法。 后悔问了这么长的问题

示例参考
本示例基于源代码,可在javapoint获取

【问题讨论】:

  • 你需要为 Student.java 添加注解..... 例如:@Entity..
  • 我还需要添加什么实体。
  • 导入名为 javax.persistence 包的包,您需要从该包中声明上述类名..@Entity...
  • 我已经导入了 javax.persistence 包,并且还使用 @Entity 注解将 Student.java 声明为实体类,但问题仍然存在
  • 我已经在使用 hibernate-jpa-2.1-api-1.0.0.Final.jar 它有更高版本然后提到..

标签: java spring hibernate spring-mvc


【解决方案1】:

我在我的示例中做了些许改动。而不是AppConfig.java,我使用ApplicationContext.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-3.0.xsd">


                <bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource">
                                <property name="driverClassName" value="oracle.jdbc.driver.OracleDriver"></property>
                                <property name="url" value="jdbc:oracle:thin:@localhost:1521:xe"></property>
                                <property name="username" value="sachin"></property>
                                <property name="password" value="sachin476"></property>
                </bean>

                <bean id="mysessionFactory"
                                class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
                                <property name="dataSource" ref="dataSource"></property>

                                <property name="mappingResources">
                                                <list>
                                                                <value>student.hbm.xml</value>
                                                </list>
                                </property>

                                <property name="hibernateProperties">
                                                <props>
                                                                <prop key="hibernate.dialect">org.hibernate.dialect.Oracle9Dialect
                                                                </prop>
                                                                <prop key="hibernate.hbm2ddl.auto">update</prop>
                                                                <prop key="hibernate.show_sql">true</prop>

                                                </props>
                                </property>
                </bean>

                <bean id="template" class="org.springframework.orm.hibernate5.HibernateTemplate">
                                <property name="sessionFactory" ref="mysessionFactory"></property>
                </bean>

                <bean id="d" class="bean.dao.StudentDao">
                                <property name="template" ref="template"></property>
                </bean>
</beans>  

并添加了两个更多 jar 文件:

>commons-dbcp2-2.1.1.jar
>commons-pool2-2.4.2.jar

用于BasicDataSource 类。

现在它给了我Exception:

Exception in thread "main" org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'mysessionFactory' defined in class path resource [xml/ApplicationContext.xml]: Initialization of bean failed; nested exception is java.lang.NoClassDefFoundError: org/hibernate/SessionFactory
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:553)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:482)
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:757)
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:861)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:541)
    at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:139)
    at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:83)
    at test.Test.main(Test.java:15)
Caused by: java.lang.NoClassDefFoundError: org/hibernate/SessionFactory
    at java.lang.Class.getDeclaredMethods0(Native Method)
    at java.lang.Class.privateGetDeclaredMethods(Class.java:2701)
    at java.lang.Class.privateGetPublicMethods(Class.java:2902)
    at java.lang.Class.getMethods(Class.java:1615)
    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:270)
    at org.springframework.beans.CachedIntrospectionResults.forClass(CachedIntrospectionResults.java:189)
    at org.springframework.beans.BeanWrapperImpl.getCachedIntrospectionResults(BeanWrapperImpl.java:173)
    at org.springframework.beans.BeanWrapperImpl.getLocalPropertyHandler(BeanWrapperImpl.java:226)
    at org.springframework.beans.BeanWrapperImpl.getLocalPropertyHandler(BeanWrapperImpl.java:63)
    at org.springframework.beans.AbstractNestablePropertyAccessor.getPropertyHandler(AbstractNestablePropertyAccessor.java:725)
    at org.springframework.beans.AbstractNestablePropertyAccessor.isWritableProperty(AbstractNestablePropertyAccessor.java:557)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1483)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1226)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:543)
    ... 11 more

但我偷看了hibernate-core-5.2.2-Final.jar,它在org.hibernate 包中有SessionFectory.class 的定义,即有一个名为org.hibernate.SessionFactory.class 的类条目。现在我想知道为什么它会给出这样的例外

更新 在谷歌上大量尝试和搜索后,我发现hibernate 5 不支持 oracle10g 驱动程序。所以我将ojdbc14.jar 更新为ojdbc6.jar,它对我有用

【讨论】:

    【解决方案2】:

    如上所述here 升级您的hibernate jpa-jar,因为hibernate4.3+ 支持的jpa 版本是2.1

    【讨论】:

    • 我已经在使用 hibernate-jpa-2.1-api 1.0.0 Final.jar。这是hibernate-jpa api的最新更新/版本
    猜你喜欢
    • 2016-05-14
    • 2014-06-24
    • 2013-03-08
    • 2011-02-20
    • 2011-06-28
    • 2018-05-07
    • 2011-10-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多