Hibernate:是什么导致我的应用程序出现“类名未映射”错误?

Hibernate: What is causing this `classname not mapped` error in my app?

我正在使用 AWS Lambda 开发 REST API。我也在使用 MySQLHibernate。我已经安装了 Docker,暂时尝试在本地 运行 应用程序。 MySQL 通过 WAMP 和 运行ning 在本地主机中安装。

下面是我的结构

下面是我的代码。

GetAllAccountTypesLambda

public class GetAllAccountTypesLambda {
    
    private final SessionFactoryBuilder sessionFactoryBuilder = SessionFactoryBuilder.getInstance();
    ObjectMapper objectMapper = new ObjectMapper();
   // private static DAOConnectionInterface daoci;
    
    public APIGatewayProxyResponseEvent getAllAccountTypes(APIGatewayProxyResponseEvent request) throws JsonProcessingException 
    {
        Session session = getSession();
        Transaction transaction = null;
        List<AccountingType> list = new ArrayList<>();;
        
         try{
            transaction = getTransaction(session);
            Query query = session.createQuery("from AccountingType");
        list = (List<AccountingType>) query.list();
            transaction.commit();
        }catch(Exception ex){
            ex.printStackTrace();
        }finally{
            session.close();
        }
         
        String writeValueAsString = objectMapper.writeValueAsString(list);
        return new APIGatewayProxyResponseEvent().withStatusCode(200).withBody(writeValueAsString);
    }
    
    private Session getSession() {
        return sessionFactoryBuilder.getSessionFactory().openSession();
    }

    private Transaction getTransaction(Session session) {
        Transaction transaction = session.beginTransaction();
        return transaction;
    }
    
}

SessionFactoryBuilder

public class SessionFactoryBuilder
{
    private static SessionFactoryBuilder instance;
    private static SessionFactory sessionFactory;
    
    private SessionFactoryBuilder()
    {
        buildConfig();
        System.out.println("Welcome");
    }
    
    private static void buildConfig()
    {
        Configuration configuration = new Configuration().configure();
            StandardServiceRegistryBuilder builder = new StandardServiceRegistryBuilder()
                            .applySettings(configuration.getProperties());
            sessionFactory = configuration.buildSessionFactory(builder.build());
    }
    
    public static SessionFactoryBuilder getInstance()
    {
         if(instance == null) 
         {
            instance = new SessionFactoryBuilder();
            
         }
      return instance;
    }
    
    public SessionFactory getSessionFactory()
    {
        return sessionFactory;
    }  

}

会计类型

public class AccountingType  implements java.io.Serializable {


     private Integer idaccountingType;
     private String type;

    public AccountingType() {
    }

    
    public AccountingType(String type) {
        this.type = type;
    }
   
    public Integer getIdaccountingType() {
        return this.idaccountingType;
    }
    
    public void setIdaccountingType(Integer idaccountingType) {
        this.idaccountingType = idaccountingType;
    }
    public String getType() {
        return this.type;
    }
    
    public void setType(String type) {
        this.type = type;
    }
}

AccountingType.hbm.xml

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<!-- Generated Jul 12, 2021, 4:27:10 PM by Hibernate Tools 4.3.1 -->
<hibernate-mapping>
    <class name="com.abcdapp.beans.AccountingType" table="accounting_type" catalog="abcd" optimistic-lock="version">
        <id name="idaccountingType" type="java.lang.Integer">
            <column name="idaccounting_type" />
            <generator class="identity" />
        </id>
        <property name="type" type="string">
            <column name="type" length="45" not-null="true" />
        </property>
    </class>
</hibernate-mapping>

下面是配置文件

template.yaml

AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: >
  abcd-restapi

  Sample SAM Template for abcd-restapi

# More info about Globals: https://github.com/awslabs/serverless-application-model/blob/master/docs/globals.rst
Globals:
  Function:
    Timeout: 100

Resources:
  GetAllAccountTypesLambda:
    Type: AWS::Serverless::Function # More info about Function Resource: https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#awsserverlessfunction
    Properties:
      CodeUri: abcd-restapi
      Handler: com.abcdapp.dao.accountingtype.GetAllAccountTypesLambda::getAllAccountTypes
      Runtime: java11
      MemorySize: 512
      Environment: # More info about Env Vars: https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#environment-object
        Variables:
          PARAM1: VALUE
      Events:
        HelloWorld:
          Type: Api # More info about API Event Source: https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#api
          Properties:
            Path: /accounttype
            Method: get

hibernate.cfg.xml

<hibernate-configuration>
  <session-factory>
    <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
    <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
    <property name="hibernate.connection.url">jdbc:mysql://host.docker.internal:3306/abcd</property>
    <property name="hibernate.connection.username">root</property>
    <property name="hibernate.c3p0.min_size">5</property>
    <property name="hibernate.c3p0.max_size">20</property>
    <property name="hibernate.c3p0.timeout">3000</property>
    <property name="hibernate.c3p0.max_statements">50</property>
    <property name="hibernate.c3p0.idle_test_period">300</property>
    <property name="hibernate.c3p0.testConnectionOnCheckout">true</property>
    <property name="hibernate.c3p0.preferredTestQuery">SELECT 1</property>
    <property name="hibernate.current_session_context_class">thread</property>
    <property name="show_sql">true</property>
    <mapping resource="com/abcdapp/beans/AccountingType.hbm.xml"/>    
  </session-factory>
</hibernate-configuration>

hibernate.reveng.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-reverse-engineering PUBLIC "-//Hibernate/Hibernate Reverse Engineering DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-reverse-engineering-3.0.dtd">

<hibernate-reverse-engineering>
  <schema-selection match-catalog="abcd"/> 
  <table-filter match-name="accounting_type"/>  
</hibernate-reverse-engineering>

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/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.abcd</groupId>
    <artifactId>abcd-restapi</artifactId>
    <version>1.0</version>
    <packaging>jar</packaging>
    <name>abcd REST API</name>
    <properties>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
    </properties>

    <dependencies>
        <dependency>
            <groupId>com.amazonaws</groupId>
            <artifactId>aws-lambda-java-core</artifactId>
            <version>1.2.1</version>
        </dependency>
        <dependency>
            <groupId>com.amazonaws</groupId>
            <artifactId>aws-lambda-java-events</artifactId>
            <version>3.6.0</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-core</artifactId>
            <version>2.12.3</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.12.3</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.hibernate/hibernate-entitymanager -->
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-entitymanager</artifactId>
            <version>5.5.3.Final</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.hibernate.javax.persistence/hibernate-jpa-2.1-api -->
        <dependency>
            <groupId>org.hibernate.javax.persistence</groupId>
            <artifactId>hibernate-jpa-2.1-api</artifactId>
            <version>1.0.2.Final</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.hibernate/hibernate-c3p0 -->
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-c3p0</artifactId>
            <version>5.5.3.Final</version>
        </dependency>


        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.5</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/com.mchange/c3p0 -->
        <dependency>
            <groupId>com.mchange</groupId>
            <artifactId>c3p0</artifactId>
            <version>0.9.5.5</version>
        </dependency>

        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.13.1</version>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-shade-plugin</artifactId>
                <version>3.2.4</version>
                <configuration>
                </configuration>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>shade</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
</project>

我使用命令 sam build 成功构建了项目。然后我使用命令sam local invoke。现在我有以下错误。我发布了完整的堆栈跟踪,以备不时之需。

START RequestId: c7c68040-0e20-4eca-8689-bd3db309b3cd Version: $LATEST
Jul 13, 2021 7:45:58 AM org.hibernate.Version logVersion
INFO: HHH000412: Hibernate ORM core version 5.5.3.Final
Jul 13, 2021 7:45:59 AM org.hibernate.boot.jaxb.internal.stax.LocalXmlResourceResolver resolveEntity
WARN: HHH90000012: Recognized obsolete hibernate namespace http://hibernate.sourceforge.net/hibernate-configuration. Use namespace http://www.hibernate.org/dtd/hibernate-configuration instead.  Support for obsolete DTD/XSD namespaces may be removed at any time.
Jul 13, 2021 7:46:00 AM org.hibernate.annotations.common.reflection.java.JavaReflectionManager <clinit>
INFO: HCANN000001: Hibernate Commons Annotations {5.1.2.Final}
Jul 13, 2021 7:46:01 AM org.hibernate.c3p0.internal.C3P0ConnectionProvider configure
INFO: HHH010002: C3P0 using driver: com.mysql.jdbc.Driver at URL: jdbc:mysql://host.docker.internal:3306/abcd
Jul 13, 2021 7:46:01 AM org.hibernate.c3p0.internal.C3P0ConnectionProvider configure
INFO: HHH10001001: Connection properties: {user=root}
Jul 13, 2021 7:46:01 AM org.hibernate.c3p0.internal.C3P0ConnectionProvider configure
INFO: HHH10001003: Autocommit mode: false
Jul 13, 2021 7:46:01 AM com.mchange.v2.log.MLog
INFO: MLog clients using java 1.4+ standard logging.
Jul 13, 2021 7:46:02 AM com.mchange.v2.c3p0.C3P0Registry
INFO: Initializing c3p0-0.9.5.5 [built 11-December-2019 22:18:33 -0800; debug? true; trace: 10]
Jul 13, 2021 7:46:02 AM org.hibernate.c3p0.internal.C3P0ConnectionProvider configure
INFO: HHH10001007: JDBC isolation level: <unknown>
Jul 13, 2021 7:46:02 AM com.mchange.v2.c3p0.impl.AbstractPoolBackedDataSource
INFO: Initializing c3p0 pool... com.mchange.v2.c3p0.PoolBackedDataSource@c0ca178d [ connectionPoolDataSource -> com.mchange.v2.c3p0.WrapperConnectionPoolDataSource@c81adb7d [ acquireIncrement -> 3, acquireRetryAttempts -> 30, acquireRetryDelay -> 1000, autoCommitOnClose -> false, automaticTestTable -> null, breakAfterAcquireFailure -> false, checkoutTimeout -> 0, connectionCustomizerClassName -> null, connectionTesterClassName -> com.mchange.v2.c3p0.impl.DefaultConnectionTester, contextClassLoaderSource -> caller, debugUnreturnedConnectionStackTraces -> false, factoryClassLocation -> null, forceIgnoreUnresolvedTransactions -> false, forceSynchronousCheckins -> false, identityToken -> 1bqq1heai182ia6xa86s64|ec0c838, idleConnectionTestPeriod -> 300, initialPoolSize -> 5, maxAdministrativeTaskTime -> 0, maxConnectionAge -> 0, maxIdleTime -> 3000, maxIdleTimeExcessConnections -> 0, maxPoolSize -> 20, maxStatements -> 50, maxStatementsPerConnection -> 0, minPoolSize -> 5, nestedDataSource -> com.mchange.v2.c3p0.DriverManagerDataSource@95bff986 [ description -> null, driverClass -> null, factoryClassLocation -> null, forceUseNamedDriverClass -> false, identityToken -> 1bqq1heai182ia6xa86s64|53812a9b, jdbcUrl -> jdbc:mysql://host.docker.internal:3306/abcd, properties -> {user=******} ], preferredTestQuery -> SELECT 1, privilegeSpawnedThreads -> false, propertyCycle -> 0, statementCacheNumDeferredCloseThreads -> 0, testConnectionOnCheckin -> false, testConnectionOnCheckout -> true, unreturnedConnectionTimeout -> 0, usesTraditionalReflectiveProxies -> false; userOverrides: {} ], dataSourceName -> null, extensions -> {}, factoryClassLocation -> null, identityToken -> 1bqq1heai182ia6xa86s64|6de54b40, numHelperThreads -> 3 ]
Jul 13, 2021 7:46:03 AM org.hibernate.dialect.Dialect <init>
INFO: HHH000400: Using dialect: org.hibernate.dialect.MySQLDialect
Welcome
java.lang.IllegalArgumentException: org.hibernate.hql.internal.ast.QuerySyntaxException: AccountingType is not mapped [from AccountingType]
        at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:138)
        at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:181)
        at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:188)
        at org.hibernate.internal.AbstractSharedSessionContract.createQuery(AbstractSharedSessionContract.java:743)
        at org.hibernate.internal.AbstractSharedSessionContract.createQuery(AbstractSharedSessionContract.java:114)
        at com.abcdapp.dao.accountingtype.GetAllAccountTypesLambda.getAllAccountTypes(GetAllAccountTypesLambda.java:38)
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
        at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
        at java.base/java.lang.reflect.Method.invoke(Unknown Source)
        at lambdainternal.EventHandlerLoader$PojoMethodRequestHandler.handleRequest(EventHandlerLoader.java:282)
        at lambdainternal.EventHandlerLoader$PojoHandlerAsStreamHandler.handleRequest(EventHandlerLoader.java:199)
        at lambdainternal.EventHandlerLoader.call(EventHandlerLoader.java:899)
        at lambdainternal.AWSLambda.startRuntime(AWSLambda.java:257)
        at lambdainternal.AWSLambda.startRuntime(AWSLambda.java:192)
        at lambdainternal.AWSLambda.main(AWSLambda.java:187)
Caused by: org.hibernate.hql.internal.ast.QuerySyntaxException: AccountingType is not mapped [from AccountingType]
        at org.hibernate.hql.internal.ast.QuerySyntaxException.generateQueryException(QuerySyntaxException.java:79)
        at org.hibernate.QueryException.wrapWithQueryString(QueryException.java:103)
        at org.hibernate.hql.internal.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:220)
        at org.hibernate.hql.internal.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:144)
        at org.hibernate.engine.query.spi.HQLQueryPlan.<init>(HQLQueryPlan.java:113)
        at org.hibernate.engine.query.spi.HQLQueryPlan.<init>(HQLQueryPlan.java:73)
        at org.hibernate.engine.query.spi.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:162)
        at org.hibernate.internal.AbstractSharedSessionContract.getQueryPlan(AbstractSharedSessionContract.java:622)
        at org.hibernate.internal.AbstractSharedSessionContract.createQuery(AbstractSharedSessionContract.java:734)
        ... 12 more
Caused by: org.hibernate.hql.internal.ast.QuerySyntaxException: AccountingType is not mapped
        at org.hibernate.hql.internal.ast.util.SessionFactoryHelper.requireClassPersister(SessionFactoryHelper.java:169)
        at org.hibernate.hql.internal.ast.tree.FromElementFactory.addFromElement(FromElementFactory.java:91)
        at org.hibernate.hql.internal.ast.tree.FromClause.addFromElement(FromClause.java:77)
        at org.hibernate.hql.internal.ast.HqlSqlWalker.createFromElement(HqlSqlWalker.java:333)
        at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.fromElement(HqlSqlBaseWalker.java:3765)
        at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.fromElementList(HqlSqlBaseWalker.java:3654)
        at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.fromClause(HqlSqlBaseWalker.java:737)
        at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.query(HqlSqlBaseWalker.java:593)
        at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.selectStatement(HqlSqlBaseWalker.java:330)
        at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.statement(HqlSqlBaseWalker.java:278)
        at org.hibernate.hql.internal.ast.QueryTranslatorImpl.analyze(QueryTranslatorImpl.java:276)
        at org.hibernate.hql.internal.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:192)
        ... 18 more
END RequestId: c7c68040-0e20-4eca-8689-bd3db309b3cd
REPORT RequestId: c7c68040-0e20-4eca-8689-bd3db309b3cd  Init Duration: 1.44 ms  Duration: 10188.35 ms   Billed Duration: 10200 ms       Memory Size: 512 MB     Max Memory Used: 512 MB
{"statusCode":200,"body":"[]"}

导致此错误的原因是什么?

我认为您创建的会话工厂过于复杂,并且未加载映射文件。

以下两种方法都应该有效。

方法一:

private static void buildConfig() {
  sessionFactory = new Configuration().configure().buildSessionFactory();
}

方法二:

private static void buildConfig() {
  ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().configure().build();

  // Create MetadataSources
  MetadataSources sources = new MetadataSources(serviceRegistry);

  // Create Metadata
  Metadata metadata = sources.getMetadataBuilder().build();

  // Create SessionFactory
  sessionFactory = metadata.getSessionFactoryBuilder().build();
}