首页 > 解决方案 > 即使映射看起来正确,休眠映射异常

问题描述

我在包中有这个 Java 应用程序com.luv2code.hibernate.demo

package com.luv2code.hibernate.demo;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

import com.luv2code.hibernate.demo.entity.Employee;

public class CreateEmployeeDemo {

    public static void main(String[] args) {
        
        // create session factory
        SessionFactory factory = new Configuration()
                                        .configure("hibernate.cfg.xml")
                                        .addAnnotatedClass(Employee.class)
                                        .buildSessionFactory();
        
        // create a session
        Session session = factory.getCurrentSession();
        
        try {
            
            // create the employee object
            System.out.println("Creating a new employee object...");
            Employee  tempEmployee = new Employee("John", "Doe", "Doe Corp.");
            
            // start a transaction
            session.beginTransaction();
            
            // save the employee object
            System.out.println("Saving the employee...");
            session.save(tempEmployee);
            
            // commit the transaction
            session.getTransaction().commit();
            
            // find the employee's ID: primary key
            System.out.println("Save employee. Generated ID: " + tempEmployee.getId());
            
            // now get a new session and start transaction
            session = factory.getCurrentSession();
            session.beginTransaction();
            
            // retrieve employee based on the ID: primary key
            System.out.println("\nGettin employee with id: " + tempEmployee.getId());
            
            Employee myEmployee = session.get(Employee.class, tempEmployee.getId());
            
            System.out.println("Get complete: " + myEmployee);
            
            // commit the transaction
            session.getTransaction().commit();
            
            // delete student id=2
            System.out.println("Deleting student id=2");
            session.createQuery("delete from Student where id = '2'").executeUpdate();
            
            
            // commit the transaction
            session.getTransaction().commit();
            
            System.out.println("Done!");
            
        }
        finally {
            factory.close();
        }

    }

}

它在包中使用这个 Employee 类com.luv2code.hibernate.demo.entity

package com.luv2code.hibernate.demo.entity;

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

public class Employee {

    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    @Column(name="id")
    private int id;
    
    @Column(name="first_name")
    private String firstName;
    
    @Column(name="last_name")
    private String lastName;
    
    @Column(name="company")
    private String company;

    public Employee() {
        
    }

    public Employee(String firstName, String lastName, String company) {
        this.firstName = firstName;
        this.lastName = lastName;
        this.company = company;
    }

    public int getId() {
        return id;
    }

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

    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 String getCompany() {
        return company;
    }

    public void setCompany(String company) {
        this.company = company;
    }

    @Override
    public String toString() {
        return "Employee [id=" + id + ", firstName=" + firstName + ", lastName=" + lastName + ", company=" + company + "]";
    }
}

当我运行程序时,我收到此错误:

Saving the employee...
Jul 17, 2020 6:46:40 PM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl$PoolState stop
INFO: HHH10001008: Cleaning up connection pool [jdbc:mysql://localhost:3306/hb_student_tracker?useSSL=false&serverTimezone=UTC]
Jul 17, 2020 6:46:40 PM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl$PooledConnections close
ERROR: Connection leak detected: there are 1 unclosed connections upon shutting down pool jdbc:mysql://localhost:3306/hb_student_tracker?useSSL=false&serverTimezone=UTC
Exception in thread "main" org.hibernate.MappingException: Unknown entity: com.luv2code.hibernate.demo.entity.Employee
    at org.hibernate.metamodel.internal.MetamodelImpl.entityPersister(MetamodelImpl.java:704)
    at org.hibernate.internal.SessionImpl.getEntityPersister(SessionImpl.java:1606)
    at org.hibernate.event.internal.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:114)
    at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:194)
    at org.hibernate.event.internal.DefaultSaveEventListener.saveWithGeneratedOrRequestedId(DefaultSaveEventListener.java:38)
    at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:179)
    at org.hibernate.event.internal.DefaultSaveEventListener.performSaveOrUpdate(DefaultSaveEventListener.java:32)
    at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:75)
    at org.hibernate.event.service.internal.EventListenerGroupImpl.fireEventOnEachListener(EventListenerGroupImpl.java:102)
    at org.hibernate.internal.SessionImpl.fireSave(SessionImpl.java:634)
    at org.hibernate.internal.SessionImpl.save(SessionImpl.java:627)
    at org.hibernate.internal.SessionImpl.save(SessionImpl.java:622)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.hibernate.context.internal.ThreadLocalSessionContext$TransactionProtectionWrapper.invoke(ThreadLocalSessionContext.java:351)
    at com.sun.proxy.$Proxy25.save(Unknown Source)
    at com.luv2code.hibernate.demo.CreateEmployeeDemo.main(CreateEmployeeDemo.java:33)

我看不出这里有什么问题。这似乎是一个映射异常,但我认为我的映射应该是正确的。有人能发现问题吗?

标签: javamysqlhibernatehibernate-mappingmappingexception

解决方案


使用 @Entity 和 @Table 作为 Employee 类的映射数据库表名

@Entity
@Table(name = "employee")
public class Employee { ... }

推荐阅读