Hibernate 5:未知实体,错误类型:org.hibernate.MappingException

Hibernate 5: Unknown entity, errorType: org.hibernate.MappingException

我们有一个最初从 https://github.com/arun-gupta/lambda-rds-mysql 克隆的代码。进行更改以使用 PostgreSQL RDS。当我们在 AWS 上 运行 这段代码时,会出现以下错误

错误信息

 {
      "errorMessage": "Unknown entity: org.sample.serverless.aws.rds.Employee",
      "errorType": "org.hibernate.MappingException",
      "stackTrace": [
        "org.hibernate.metamodel.internal.MetamodelImpl.entityPersister(MetamodelImpl.java:620)",
        "org.hibernate.internal.SessionImpl.getEntityPersister(SessionImpl.java:1639)",
        "org.hibernate.event.internal.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:108)",
        "org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:192)",
        "org.hibernate.event.internal.DefaultSaveEventListener.saveWithGeneratedOrRequestedId(DefaultSaveEventListener.java:38)",
        "org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:177)",
        "org.hibernate.event.internal.DefaultSaveEventListener.performSaveOrUpdate(DefaultSaveEventListener.java:32)",
        "org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:73)",
        "org.hibernate.internal.SessionImpl.fireSave(SessionImpl.java:694)",
        "org.hibernate.internal.SessionImpl.save(SessionImpl.java:686)",
        "org.hibernate.internal.SessionImpl.save(SessionImpl.java:681)",
        "org.sample.serverless.aws.rds.EmployeeHandler.handleRequest(EmployeeHandler.java:21)",
        "org.sample.serverless.aws.rds.EmployeeHandler.handleRequest(EmployeeHandler.java:11)"
      ]
    }

以下是代码文件,能否请您帮助我们理解为什么会收到此错误:

员工经理

public class EmployeeHandler implements RequestHandler<Request, String> {

    @Override
    public String handleRequest(Request request, Context context) {

        SessionFactory sessionFactory = HibernateUtil.getSessionFactory();
        try (Session session = sessionFactory.openSession()) {
            session.beginTransaction();
            Employee employee = new Employee();
            employee.setId(request.id);
            employee.setName(request.name);
            session.save(employee);
            session.getTransaction().commit();
        }

        return String.format("Added %s %s.", request.id, request.name);
    }
}

HibernateUtil

private static SessionFactory sessionFactory;

public static SessionFactory getSessionFactory() {
    if (null != sessionFactory)
        return sessionFactory;

    Configuration configuration = new Configuration();

    String jdbcUrl = "jdbc:postgresql://"
            + System.getenv("RDS_HOSTNAME")
            + "/"
            + System.getenv("RDS_DB_NAME");

    configuration.setProperty("hibernate.connection.url", jdbcUrl);
    configuration.setProperty("hibernate.connection.username", System.getenv("RDS_USERNAME"));
    configuration.setProperty("hibernate.connection.password", System.getenv("RDS_PASSWORD"));

    configuration.configure();
    ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().applySettings(configuration.getProperties()).build();
    try {
        sessionFactory = configuration.buildSessionFactory(serviceRegistry);
    } catch (HibernateException e) {
        System.err.println("Initial SessionFactory creation failed." + e);
        throw new ExceptionInInitializerError(e);
    }
    return sessionFactory;
}

员工实体

package org.sample.serverless.aws.rds;

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

@Entity
@Table(name = "Employee")
public class Employee implements java.io.Serializable {
    private static final long serialVersionUID = 1L;
    private int id;
    private String name;

    public Employee() {
    }

    public Employee(int id, String name) {
        this.id = id;
        this.name = name;
    }

    @Id
    public int getId() {
        return id;
    }

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

    public String getName() {
        return name;
    }

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

    @Override
    public String toString() {
        return "Employee{" + "id=" + id + ", name=" + name + '}';
    }
}

休眠 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">org.postgresql.Driver</property>
        <property name="hibernate.dialect">org.hibernate.dialect.PostgreSQLDialect</property>
        <property name="show_sql">true</property> 
        <property name="connection.pool_size">1</property>

        <mapping class="org.sample.serverless.aws.rds.Employee"/>

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

在 HibernateUtil class 中添加以下行(在 configuration.configure(); 之前)。

configuration.addAnnotatedClass(Employee.class);

我试过这段代码并成功了:

/*
ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().applySettings(configuration.getProperties()).build()
*/
ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().applySettings(configuration.getProperties()).configure().build();

    try {
        sessionFactory = configuration.buildSessionFactory(serviceRegistry);
    } catch (HibernateException e) {
        System.err.println("Initial SessionFactory creation failed." + e);
        throw new ExceptionInInitializerError(e);
    }

Source