【问题标题】:getting error "java.lang.NoClassDefFoundError: org/hibernate/cfg/Mappings" in a simple maven hibernate project在一个简单的 maven hibernate 项目中出现错误“java.lang.NoClassDefFoundError: org/hibernate/cfg/Mappings”
【发布时间】:2023-03-15 13:15:01
【问题描述】:

我正在开发一个使用 maven、hibernate 和 mysql 的项目。这是我的 pom.xml:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.heroku.realstate</groupId>
    <artifactId>realstate-database</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>jar</packaging>

    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.38</version>
        </dependency>
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-core</artifactId>
            <version>5.1.0.Final</version>
        </dependency>
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-entitymanager</artifactId>
            <version>5.1.0.Final</version>
        </dependency>
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>ejb3-persistence</artifactId>
            <version>1.0.2.GA</version>
        </dependency>
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-tools</artifactId>
            <version>4.3.2.Final</version>
        </dependency>

        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-annotations</artifactId>
            <version>3.5.6-Final</version>
        </dependency>
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-commons-annotations</artifactId>
            <version>3.2.0.Final</version>
        </dependency>

    </dependencies>

</project>

这是我的资源/hibernate.cfg.xml:

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
        "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
        "http://hibernate.sourceforge.net/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/$DATABASE_NAME
        </property>
        <property name="hibernate.connection.password">
            $PASSWORD
        </property>
        <property name="hibernate.connection.username">
            @USERNAME
        </property>
        <property name="hibernate.dialect">
            org.hibernate.dialect.MySQLDialect
        </property>
        <property name="show_sql">
            true
        </property>
        <property name="hbm2ddl.auto">
            create
        </property>

        <mapping class="com.heroku.realstate.database.user.UserEntity"/>
        <mapping class="com.heroku.realstate.database.user.ClientEntity"/>
        <mapping class="com.heroku.realstate.database.user.BotEntity"/>
        <mapping class="com.heroku.realstate.database.sms.SmsEntity"/>

    </session-factory>
</hibernate-configuration>

我已经安装了 mysql 并创建了一个名为 $DATABASE_NAME 的数据库,但我还没有在数据库中创建任何表(因为我不是 sql 专家,我希望 hibernate 可以为像我这样的人做这件事!)。这是我使用休眠的方式:

class HibernateUtils {

    private static final SessionFactory sessionFactory = buildSessionFactory();

    private static SessionFactory buildSessionFactory() {
        // Create the SessionFactory from hibernate.cfg.xml
        return new AnnotationConfiguration().configure(new File("hibernate.cfg.xml")).buildSessionFactory();
    }

    static SessionFactory getSessionFactory() {
        return sessionFactory;
    }
    static void shutdown() {
        // Close caches and connection pools
        getSessionFactory().close();
    }

我通过 maven 构建了这个项目,它成功构建了。但是当我运行应用程序时,JVM 给了我错误:java.lang.NoClassDefFoundError: org/hibernate/cfg/Mappings 在这一行:

return new AnnotationConfiguration().configure(new File("hibernate.cgf.xml")).buildSessionFactory();

有什么问题?我应该如何解决它?谢谢!

【问题讨论】:

    标签: java mysql hibernate maven annotations


    【解决方案1】:

    尝试替换这一行:

      return new AnnotationConfiguration().configure(new File("hibernate.cgf.xml")).buildSessionFactory();
    

    与:

       return new Configuration().configure().buildSessionFactory();
    

    因为Deprecated。使用给定应用程序文件中指定的映射和属性。

    欲了解更多信息,请转到AnnotationConfiguration

    【讨论】:

    • AnnotationConfiguration 来自 Hibernate 3。
    【解决方案2】:

    图书馆的问题。你使用 Hibernate 5。所以你在pom.xml 中不需要这个

            <dependency>
                <groupId>org.hibernate</groupId>
                <artifactId>ejb3-persistence</artifactId>
                <version>1.0.2.GA</version>
            </dependency>
    
            <dependency>
                <groupId>org.hibernate</groupId>
                <artifactId>hibernate-annotations</artifactId>
                <version>3.5.6-Final</version>
            </dependency>
            <dependency>
                <groupId>org.hibernate</groupId>
                <artifactId>hibernate-commons-annotations</artifactId>
                <version>3.2.0.Final</version>
            </dependency>
    

    Hibernate 5 使用hibernate-commons-annotations-5.0.1.Final.jar,您不需要指定它。因为,它是一个传递依赖。

    你也不需要它,因为你不使用JPA

       <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-entitymanager</artifactId>
            <version>5.1.0.Final</version>
       </dependency>
    

    Hibernate 4 和 Hibernate 5 中没有AnnotationConfiguration。它是从 Hibernate 3 形成的!

    配置 Hibernate 5

     private static SessionFactory buildSessionFactory() {
        return new Configuration().configure().buildSessionFactory();
     }
    

    【讨论】:

      【解决方案3】:

      如果您使用高于版本 3 的 Hibernate(如构建版本 4 或 5),只需使用 Configuration 而不是 AnnotationConfiguration 类,因为 AnnotationConfiguration 已删除版本 3 之后。

      让我们有一个包含 11 个依赖项和配置的快照示例,以使用基于注解的映射配置。

      1.  antlr-2.7.7.jar
      2.  classmate-1.3.0.jar
      3.  dom4j-1.6.1.jar
      4.  geronimo-jta_1.1_spec-1.1.1.jar
      5.  hibernate-commons-annotations-5.0.1.Final.jar
      6.  hibernate-core-5.1.10.Final.jar
      7.  hibernate-jpa-2.1-api-1.0.0.Final.jar
      8.  jandex-2.0.3.Final.jar
      9.  javassist-3.20.0-GA.jar
      10. jboss-logging-3.3.0.Final.jar
      11. mysql-connector-java-5.1.38-bin.jar
      

      配置文件如下:

      <hibernate-configuration>
      <session-factory>
          <property name="hibernate.connection.driver.class">com.mysql.jdbc.Driver</property>
          <property name="hibernate.connection.url">jdbc:mysql://zampylob:3306/hibernatedb</property>
          <property name="hibernate.connection.username">hiberuser</property>
          <property name="hibernate.connection.password">XXXXXXXXXX</property>
          <property name="hibernate.connection.dialect">org.hibernate.dialect.MySQLDialect</property>
          <property name="hibernate.connection.show_sql">true</property>
          <property name="hibernate.connection.format_sql">true</property>
          <property name="hibernate.hbm2ddl.auto">create</property>
      
          <mapping class="com.whodesire.model.Student" />
      </session-factory>
      </hibernate-configuration>
      

      学生POJO课是:

      import java.util.Date;
      
      import javax.persistence.Entity;
      import javax.persistence.Id;
      
      @Entity
      public class Student {
      
          @Id
          private Integer rollNo;
      
          private String firstName;
          private String middleName;
          private String lastName;
          private Date dateOfBirth;
          private String gender;
      
          public Integer getRollNo() {
              return rollNo;
          }
      
          public void setRollNo(Integer rollNo) {
              this.rollNo = rollNo;
          }
      
          public String getFirstName() {
              return firstName;
          }
      
          public void setFirstName(String firstName) {
              this.firstName = firstName;
          }
      
          public String getMiddleName() {
              return middleName;
          }
      
          public void setMiddleName(String middleName) {
              this.middleName = middleName;
          }
      
          public String getLastName() {
              return lastName;
          }
      
          public void setLastName(String lastName) {
              this.lastName = lastName;
          }
      
          public String getGender() {
              return gender;
          }
      
          public void setGender(String gender) {
              this.gender = gender;
          }
      
          public Date getDateOfBirth() {
              return dateOfBirth;
          }
      
          public void setDateOfBirth(Date dateOfBirth) {
              this.dateOfBirth = dateOfBirth;
          }
      }
      

      最后主类是:

      SessionFactory factory = new Configuration().configure("resources/hibernate.cfg.xml").buildSessionFactory();
      Session session = factory.openSession();
      Transaction transaction = session.beginTransaction();
      
      Student student = new Student();
      student.setRollNo(1002);
      student.setFirstName("Maaherin");
      student.setMiddleName("Zubbair");
      student.setLastName("Gulfam");
      student.setDateOfBirth(new Date());
      student.setGender("Male");
      
      session.persist(student);
      transaction.commit();
      session.close();
      

      【讨论】:

        猜你喜欢
        • 2012-04-08
        • 1970-01-01
        • 1970-01-01
        • 2016-08-11
        • 2022-01-28
        • 2018-08-22
        • 2019-06-04
        • 2012-10-20
        • 2020-04-14
        相关资源
        最近更新 更多