Java 线程“main”org.hibernate.MappingException中的异常:未知实体:com.myApp.data.entities.User

Java 线程“main”org.hibernate.MappingException中的异常:未知实体:com.myApp.data.entities.User,java,hibernate,mysql-connector,Java,Hibernate,Mysql Connector,我已经讨论了这里发布的大多数类似问题,发现解决方案是使用javax.persistence.Entity导入,而不是org.hibernate.annotations.Entity 我使用了正确的导入,但仍然得到org.hibernate.MappingException 我正在使用mysql连接器java版本6.0.5,hibernate核心版本5.2.6.Final和hibernate注释版本3.5.6-Final Exception in thread "main" org.hiberna

我已经讨论了这里发布的大多数类似问题,发现解决方案是使用javax.persistence.Entity导入,而不是org.hibernate.annotations.Entity

我使用了正确的导入,但仍然得到org.hibernate.MappingException

我正在使用mysql连接器java版本6.0.5,hibernate核心版本5.2.6.Final和hibernate注释版本3.5.6-Final

Exception in thread "main" org.hibernate.MappingException: Unknown entity: com.myApp.data.entities.User
    at org.hibernate.metamodel.internal.MetamodelImpl.entityPersister(MetamodelImpl.java:620)
    at org.hibernate.internal.SessionImpl.getEntityPersister(SessionImpl.java:1627)
    at org.hibernate.event.internal.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:104)
    at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:192)
    at org.hibernate.event.internal.DefaultSaveEventListener.saveWithGeneratedOrRequestedId(DefaultSaveEventListener.java:38)
    at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:177)
    at org.hibernate.event.internal.DefaultSaveEventListener.performSaveOrUpdate(DefaultSaveEventListener.java:32)
    at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:73)
    at org.hibernate.internal.SessionImpl.fireSave(SessionImpl.java:682)
    at org.hibernate.internal.SessionImpl.save(SessionImpl.java:674)
    at org.hibernate.internal.SessionImpl.save(SessionImpl.java:669)
    at com.myApp.data.Application.main(Application.java:26)
pom.xml如下所示:

<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.myApp</groupId>
  <artifactId>hibernate-course</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <name>hibernate-course</name>
  <dependencies>
    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-core</artifactId>
        <version>5.2.6.Final</version>
    </dependency>
    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-annotations</artifactId>
        <version>3.5.6-Final</version>
    </dependency>
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-api</artifactId>
        <version>1.7.22</version>
    </dependency>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>6.0.5</version>
    </dependency>
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-log4j12</artifactId>
        <version>1.7.22</version>
    </dependency>
  </dependencies>
</project>
用户实体类

package com.myApp.data.entities;

import java.util.Date;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity
@Table(name="finances_user")
public class User {

    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    @Column(name="USER_ID")
    private Long userId;

    @Column(name="FIRST_NAME")
    private String firstName;

    @Column(name="LAST_NAME")
    private String lastName;

    @Column(name="BIRTH_DATE")
    private Date birthDate;

    @Column(name="EMAIL_ADDRESS")
    private String emailAddress;

    @Column(name="LAST_UPDATED_DATE")
    private Date lastUpdatedDate;

    @Column(name="LAST_UPDATED_BY")
    private String lastUpdatedBy;

    @Column(name="CREATED_DATE")
    private Date createdDate;

    @Column(name="CREATED_BY")
    private String createdBy;

    public Long getUserId() {
        return userId;
    }

    public void setUserId(Long userId) {
        this.userId = userId;
    }

    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    public Date getBirthDate() {
        return birthDate;
    }

    public void setBirthDate(Date birthDate) {
        this.birthDate = birthDate;
    }

    public String getEmailAddress() {
        return emailAddress;
    }

    public void setEmailAddress(String emailAddress) {
        this.emailAddress = emailAddress;
    }

    public Date getLastUpdatedDate() {
        return lastUpdatedDate;
    }

    public void setLastUpdatedDate(Date lastUpdatedDate) {
        this.lastUpdatedDate = lastUpdatedDate;
    }

    public String getLastUpdatedBy() {
        return lastUpdatedBy;
    }

    public void setLastUpdatedBy(String lastUpdatedBy) {
        this.lastUpdatedBy = lastUpdatedBy;
    }

    public Date getCreatedDate() {
        return createdDate;
    }

    public void setCreatedDate(Date createdDate) {
        this.createdDate = createdDate;
    }

    public String getCreatedBy() {
        return createdBy;
    }

    public void setCreatedBy(String createdBy) {
        this.createdBy = createdBy;
    }

}
Hibernate SessionFactory配置类

package com.myApp.data;

import org.hibernate.SessionFactory;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.cfg.Configuration;

public class HibernateUtil {

    private static final SessionFactory sessionFactory = buildSessionFactory();

    private static SessionFactory buildSessionFactory() {
        try {
            Configuration configuration = new Configuration();
            configuration.configure();
            return configuration
                    .buildSessionFactory(new StandardServiceRegistryBuilder()
                            .applySettings(configuration.getProperties())
                            .build());
        } catch (Exception e) {
            e.printStackTrace();
            throw new RuntimeException(
                    "There was an error building the factory");
        }
    }

    public static SessionFactory getSessionFactory() {
        return sessionFactory;
    }
}
最后是hibernate.cfg.xml

<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
        "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">

<hibernate-configuration>

    <session-factory>

        <!-- Database connection settings -->
        <property name="connection.url">jdbc:mysql://localhost:3306/ifinances?useSSL=false</property>
        <property name="connection.username">infinite</property>
        <property name="connection.password">skills</property>

        <!-- SQL dialect -->
        <property name="dialect">org.hibernate.dialect.MySQL5Dialect</property>

        <!-- Echo all executed SQL to stdout -->
        <property name="show_sql">true</property>

        <mapping class="com.myApp.data.entities.User"/>

    </session-factory>

</hibernate-configuration>

我使用configuration.addAnnotatedClassUser.class,使用hibernate.properties而不是hibernate.cfg.xml检查了相同的内容;它编译和执行时没有任何异常。

尝试使用AnnotationConfiguration而不是Configuration

Configuration configuration = new AnnotationConfiguration();

尝试使用AnnotationConfiguration而不是Configuration

Configuration configuration = new AnnotationConfiguration();

找到了解决办法。上面的代码在Hibernate 4.3.6中可以正常工作,但问题是在使用Hibernate 5时。以下代码存在问题:

    return configuration
            .buildSessionFactory(new StandardServiceRegistryBuilder()
                    .applySettings(configuration.getProperties())
                    .build());
问题是当您将StandardServiceRegistryBuilder作为buildSessionFactory内的参数传递时。执行此操作时,配置会丢失通过configuration.configure获取的所有映射信息;声明

这就是为什么在使用hibernate.properties文件时代码运行良好的原因,该文件不使用configuration.configure,但在使用hibernate.cfg.xml时导致异常

使用hibernate.cfg.xml时

<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
        "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">

<hibernate-configuration>

    <session-factory>

        <!-- Database connection settings -->
        <property name="connection.url">jdbc:mysql://localhost:3306/ifinances?useSSL=false</property>
        <property name="connection.username">infinite</property>
        <property name="connection.password">skills</property>

        <!-- SQL dialect -->
        <property name="dialect">org.hibernate.dialect.MySQL5Dialect</property>

        <!-- Echo all executed SQL to stdout -->
        <property name="show_sql">true</property>

        <mapping class="com.myApp.data.entities.User"/>

    </session-factory>

</hibernate-configuration>
使用HibernateXML配置方法时,只需返回使用无参数buildSessionFactory方法的sessionFactory

实际代码使用hibernate.cfg.xml工作

<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
        "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">

<hibernate-configuration>

    <session-factory>

        <!-- Database connection settings -->
        <property name="connection.url">jdbc:mysql://localhost:3306/ifinances?useSSL=false</property>
        <property name="connection.username">infinite</property>
        <property name="connection.password">skills</property>

        <!-- SQL dialect -->
        <property name="dialect">org.hibernate.dialect.MySQL5Dialect</property>

        <!-- Echo all executed SQL to stdout -->
        <property name="show_sql">true</property>

        <mapping class="com.myApp.data.entities.User"/>

    </session-factory>

</hibernate-configuration>
问题解决了

package com.myApp.data;

import org.hibernate.SessionFactory;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.cfg.Configuration;

import com.myApp.data.entities.User;

public class HibernateUtil {

    private static final SessionFactory sessionFactory = buildSessionFactory();

    private static SessionFactory buildSessionFactory() {
        try {
            Configuration configuration = new Configuration();
            configuration.configure();

            /*return configuration
                    .buildSessionFactory(new StandardServiceRegistryBuilder()
                            .applySettings(configuration.getProperties())
                            .build());  -- does not work while using hibernate.cfg.xml, but works with hibernate.properties*/

            return configuration
                    .buildSessionFactory(); 
        } catch (Exception e) {
            e.printStackTrace();
            throw new RuntimeException(
                    "There was an error building the factory");
        }
    }

    public static SessionFactory getSessionFactory() {
        return sessionFactory;
    }
    }

感谢所有帮助过你的人

找到了解决办法。上面的代码在Hibernate 4.3.6中可以正常工作,但问题是在使用Hibernate 5时。以下代码存在问题:

    return configuration
            .buildSessionFactory(new StandardServiceRegistryBuilder()
                    .applySettings(configuration.getProperties())
                    .build());
问题是当您将StandardServiceRegistryBuilder作为buildSessionFactory内的参数传递时。执行此操作时,配置会丢失通过configuration.configure获取的所有映射信息;声明

这就是为什么在使用hibernate.properties文件时代码运行良好的原因,该文件不使用configuration.configure,但在使用hibernate.cfg.xml时导致异常

使用hibernate.cfg.xml时

<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
        "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">

<hibernate-configuration>

    <session-factory>

        <!-- Database connection settings -->
        <property name="connection.url">jdbc:mysql://localhost:3306/ifinances?useSSL=false</property>
        <property name="connection.username">infinite</property>
        <property name="connection.password">skills</property>

        <!-- SQL dialect -->
        <property name="dialect">org.hibernate.dialect.MySQL5Dialect</property>

        <!-- Echo all executed SQL to stdout -->
        <property name="show_sql">true</property>

        <mapping class="com.myApp.data.entities.User"/>

    </session-factory>

</hibernate-configuration>
使用HibernateXML配置方法时,只需返回使用无参数buildSessionFactory方法的sessionFactory

实际代码使用hibernate.cfg.xml工作

<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
        "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">

<hibernate-configuration>

    <session-factory>

        <!-- Database connection settings -->
        <property name="connection.url">jdbc:mysql://localhost:3306/ifinances?useSSL=false</property>
        <property name="connection.username">infinite</property>
        <property name="connection.password">skills</property>

        <!-- SQL dialect -->
        <property name="dialect">org.hibernate.dialect.MySQL5Dialect</property>

        <!-- Echo all executed SQL to stdout -->
        <property name="show_sql">true</property>

        <mapping class="com.myApp.data.entities.User"/>

    </session-factory>

</hibernate-configuration>
问题解决了

package com.myApp.data;

import org.hibernate.SessionFactory;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.cfg.Configuration;

import com.myApp.data.entities.User;

public class HibernateUtil {

    private static final SessionFactory sessionFactory = buildSessionFactory();

    private static SessionFactory buildSessionFactory() {
        try {
            Configuration configuration = new Configuration();
            configuration.configure();

            /*return configuration
                    .buildSessionFactory(new StandardServiceRegistryBuilder()
                            .applySettings(configuration.getProperties())
                            .build());  -- does not work while using hibernate.cfg.xml, but works with hibernate.properties*/

            return configuration
                    .buildSessionFactory(); 
        } catch (Exception e) {
            e.printStackTrace();
            throw new RuntimeException(
                    "There was an error building the factory");
        }
    }

    public static SessionFactory getSessionFactory() {
        return sessionFactory;
    }
    }

感谢所有帮助过你的人

我想看看这个方法:configuration.configure;在HibernateUtilNo内部,这不是JPA API。标签修好了@MaciejKowalski使用configuration.configure;要将hibernate.cfg.xml设置为默认配置,因为我的resources@NeilStockton对不起,我不明白你想说什么。你能解释一下吗?如果您确实指出import javax.persistence.Entity的使用,我知道我正在使用HibernateAPI;不是org.hibernate.annotations,而是itz,因为org.hibernate.annotations已被弃用,并且在JPA1之前就存在。您能否验证如果使用no-arg buildSessionFactory会发生什么情况?您的映射类声明看起来正确。我想看看这个方法:configuration.configure;在HibernateUtilNo内部,这不是JPA API。标签修好了@MaciejKowalski使用configuration.configure;要将hibernate.cfg.xml设置为默认配置,因为我的resources@NeilStockton对不起,我不明白你想说什么。你能解释一下吗?如果您确实指出import javax.persistence.Entity的使用,我知道我正在使用HibernateAPI;不是org.hibernate.annotations,而是itz,因为org.hibernate.annotations已被弃用,并且在JPA1之前就存在。您能否验证如果使用no-arg buildSessionFactory会发生什么情况?您的映射类声明看起来正确。这将导致java.lang.NoClassDefFoundError:org/hibernate/cfg/Mappings异常这将导致java.lang.NoClassDefFoundError:org/hibernate/cfg/Mappings异常exception@MattC你救了我一天!很高兴这对你有用。当有疑问时,我会尝试简化和尝试不同的变体。@MattC你救了我一天!很高兴这对你有用。当有疑问时,我会尝试简化并尝试不同的变体。