java - 线程 "main"org.hibernate.MappingException : Unknown entity: com. myApp.data.entities.User 中的异常

标签 java hibernate mysql-connector

我已经解决了此处发布的大部分类似问题,发现的解决方案是使用 javax.persistence.Entity 导入而不是 org.hibernate.annotations.Entity。

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

我正在使用 mysql-connector-java 版本 6.0.5 和 hibernate-core 版本 5.2.6.Final 和 hibernate-annotations 版本 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>

下面是我的主类Application.java

package com.myApp.data;

import java.util.Date;

import org.hibernate.Session;

import com.myApp.data.entities.User;


public class Application {

    public static void main(String[] args) {
        Session session = HibernateUtil.getSessionFactory().openSession();
        session.getTransaction().begin();

        User user = new User();
        user.setBirthDate(new Date());
        user.setCreatedBy("Smith");
        user.setCreatedDate(new Date());
        user.setEmailAddress("david_cfd@gmail.com");
        user.setFirstName("David");
        user.setLastName("Copperfield");
        user.setLastUpdatedBy("david");
        user.setLastUpdatedDate(new Date());

        session.save(user);

        session.close();
    }
}

用户实体类

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>

我使用 hibernate.properties 而不是 hibernate.cfg.xml 通过使用 configuration.addAnnotatedClass(User.class); 检查了同样的事情,它编译和执行没有任何异常。

最佳答案

找到解决方案。上面的代码在 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 时

当使用 hibernate xml 配置方法时,您可以简单地返回使用 no-arg buildSessionFactory() 方法的 sessionFactory

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

问题已解决!

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;
    }
    }

感谢所有帮助过的人!

关于java - 线程 "main"org.hibernate.MappingException : Unknown entity: com. myApp.data.entities.User 中的异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41725280/

相关文章:

java - 如何从扩展 JobService 的类中调用以 View 作为参数的 MainActivity 方法?

java - 是否可以使用 try-with-resources 语句完全防止异常屏蔽

java - HQL 从多对多映射中删除关联

c# - NHibernate 无状态插入行为

c++ - MySQL C++ 连接器安装

java - 如何在 Eclipse 中使用 MySql 数据库

java - @Transactional 在服务中的使用,当方法仅从数据库中获取数据时。

java - hibernate + postgres java.lang.ClassNotFoundException : jdbc. driverClassName

python - 连接 mysql wamp 和 django 时出现问题?

java - 如何在 Java 服务器中重新创建由 Android 压缩的 JPEG 文件