【问题标题】:Hibernate Mapping Exception : Unknown Entity休眠映射异常:未知实体
【发布时间】:2017-01-22 04:57:42
【问题描述】:

我正在使用 xml 文件映射将一个简单的 POJO 映射到 SQL Server 中的数据库表。我收到休眠映射异常:未知实体
这些是我的代码文件:
入口点类:

public class Program {

    public static void main(String[] args) {
        System.out.println("Helo World");

        Session session = HibernateUtilities.getSessionFactory().openSession();
        session.beginTransaction();

        User user = new User();
        user.setId(1);
        user.setName("Ajay");
        user.setGoal(100);
        user.setTotal(0);

        session.save(user);

        session.getTransaction().commit();
        session.close();
        HibernateUtilities.getSessionFactory().close();
        System.out.println("session closed");
    }

}

这是 HibernateUtilities 类:

public class HibernateUtilities {
        private static SessionFactory sessionFactory;
        private static ServiceRegistry serviceRegistry;
        static {
            try {
                Configuration configuration = new Configuration().configure();
                serviceRegistry = new StandardServiceRegistryBuilder()
                        .applySettings(configuration.getProperties()).build();
                sessionFactory = configuration.buildSessionFactory(serviceRegistry);
            } catch (HibernateException e) {
                System.out.println(e);
            }
        }

        public static SessionFactory getSessionFactory(){
            return sessionFactory;
        }

}

这是 POJO 用户:

public class User {
    private int id;
    private String name;
    private int total;
    private int goal;

    public int getId() {
        return id;
    }

    public String getName() {
        return name;
    }

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

    public int getTotal() {
        return total;
    }

    public void setTotal(int total) {
        this.total = total;
    }

    public int getGoal() {
        return goal;
    }

    public void setGoal(int goal) {
        this.goal = goal;
    }

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

这是映射文件:

<?xml version="1.0"?>
    <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
                                       "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
    <!-- Generated Sep 14, 2016 11:58:02 AM by Hibernate Tools 3.4.0.CR1 -->
    <hibernate-mapping package="com.example.hibernate">
     <class entity-name="User" name="com.example.hibernate.User" table="USERS">
      <id name="id" type="int">
       <column name="ID"/>
       <generator class="increment"/>
      </id>
      <property generated="never" lazy="false" name="name" type="java.lang.String">
       <column name="NAME"/>
      </property>
      <property generated="never" lazy="false" name="total" type="int">
       <column name="TOTAL"/>
      </property>
      <property generated="never" lazy="false" name="goal" type="int">
       <column name="GOAL"/>
      </property>
     </class>
    </hibernate-mapping>

这是配置文件:

<?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 name="">
      <property name="hibernate.connection.driver_class">com.microsoft.sqlserver.jdbc.SQLServerDriver</property>
      <property name="hibernate.connection.password">ajay1994</property>
      <property name="hibernate.connection.url">jdbc:sqlserver://localhost:1433;databaseName=protein_tracker</property>
      <property name="hibernate.connection.username">test</property>
      <property name="hibernate.dialect">org.hibernate.dialect.SQLServerDialect</property>
      <mapping class="com.example.hibernate.User" resource="com/example/hibernate/User.hbm.xml"/>
     </session-factory>
    </hibernate-configuration>

错误堆栈跟踪:

Helo World
Sep 14, 2016 2:58:58 PM org.hibernate.Version logVersion
INFO: HHH000412: Hibernate Core {5.2.2.Final}
Sep 14, 2016 2:58:58 PM org.hibernate.cfg.Environment <clinit>
INFO: HHH000206: hibernate.properties not found
Sep 14, 2016 2:58:58 PM org.hibernate.cfg.Environment buildBytecodeProvider
INFO: HHH000021: Bytecode provider name : javassist
Sep 14, 2016 2:58:58 PM 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.
Sep 14, 2016 2:58:58 PM org.hibernate.annotations.common.reflection.java.JavaReflectionManager <clinit>
INFO: HCANN000001: Hibernate Commons Annotations {5.0.1.Final}
Sep 14, 2016 2:58:58 PM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl configure
WARN: HHH10001002: Using Hibernate built-in connection pool (not for production use!)
Sep 14, 2016 2:58:58 PM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator
INFO: HHH10001005: using driver [com.microsoft.sqlserver.jdbc.SQLServerDriver] at URL [jdbc:sqlserver://localhost:1433;databaseName=protein_tracker]
Sep 14, 2016 2:58:58 PM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator
INFO: HHH10001001: Connection properties: {user=test, password=****}
Sep 14, 2016 2:58:58 PM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator
INFO: HHH10001003: Autocommit mode: false
Sep 14, 2016 2:58:58 PM org.hibernate.engine.jdbc.connections.internal.PooledConnections <init>
INFO: HHH000115: Hibernate connection pool size: 20 (min=1)
Sep 14, 2016 2:58:58 PM org.hibernate.dialect.Dialect <init>
INFO: HHH000400: Using dialect: org.hibernate.dialect.SQLServerDialect
Exception in thread "main" org.hibernate.MappingException: Unknown entity: com.example.hibernate.User
    at org.hibernate.metamodel.internal.MetamodelImpl.entityPersister(MetamodelImpl.java:620)
    at org.hibernate.internal.SessionImpl.getEntityPersister(SessionImpl.java:1604)
    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:673)
    at org.hibernate.internal.SessionImpl.save(SessionImpl.java:665)
    at org.hibernate.internal.SessionImpl.save(SessionImpl.java:660)
    at com.example.hibernate.Program.main(Program.java:18)

【问题讨论】:

  • 你好有一个类似的问题there希望对你有帮助
  • @Ray Lloy,感谢您的链接,我尝试了这些步骤,但仍然得到相同的响应。

标签: java sql-server hibernate orm configuration-files


【解决方案1】:

对于今天引用此问题的任何人。看起来他正在使用 xml 进行映射,并且在 cfg.xml 中他使用了类和资源。如果您使用 hbm.xml 进行映射,cfg.xml 应该包含

  <mapping resource="com/example/hibernate/User.hbm.xml"/>

如果您使用注解进行映射,cfg.xml 应包含以下映射

  <mapping class="com.example.hibernate.User"/>

你不能同时在映射中使用。

【讨论】:

    【解决方案2】:

    打开 hibernate.cfg.xml 文件。按住 ctrl 并单击映射类“com.example.hibernate.User”检查您是否导航到 User 类。

    【讨论】:

    • 那么你的模型路径是正确的。现在验证 hbm 文件是否放置在正确的路径。或将您的项目层次结构发送给我。
    • hibernate-core-5.2.2-Final.jar 存在一些问题.....我在 4.3.5-Final.jar 上运行了相同的代码并且代码有效。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-10-18
    • 2019-12-03
    • 2020-12-18
    • 2016-02-05
    • 2012-03-11
    • 1970-01-01
    相关资源
    最近更新 更多