java 线程“main”org.hibernate.MappingException 中的异常:未知实体
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/33194384/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Exception in thread "main" org.hibernate.MappingException: Unknown entity
提问by LinhSaysHi
Going through the "Introduction to Hibernate" tutorials on PluralSight. I have this exception error. The full error being:
阅读 PluralSight 上的“Hibernate 简介”教程。我有这个异常错误。完整的错误是:
Exception in thread "main" org.hibernate.MappingException: Unknown entity: com.simpleprogrammer.User
at org.hibernate.internal.SessionFactoryImpl.getEntityPersister(SessionFactoryImpl.java:776)
at org.hibernate.internal.SessionImpl.getEntityPersister(SessionImpl.java:1451)
at org.hibernate.event.internal.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:100)
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:678)
at org.hibernate.internal.SessionImpl.save(SessionImpl.java:670)
at org.hibernate.internal.SessionImpl.save(SessionImpl.java:665)
at com.simpleprogrammer.Program.main(Program.java:15)
Not sure what is wrong. I created the User.java pojo. I created a the table that matched the pojo. I created the mapping and then added the mapping to the hibernate.cfg.xml file. However, still getting the error. Can anyone help me through this?
不知道出了什么问题。我创建了 User.java pojo。我创建了一个与 pojo 匹配的表。我创建了映射,然后将映射添加到 hibernate.cfg.xml 文件中。但是,仍然收到错误。谁能帮我解决这个问题?
hibernate.cfg.xml
休眠文件.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 name="">
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.default_schema">protein_tracker</property>
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<mapping class="com.simpleprogrammer.User" resource="com/simpleprogrammer/User.hbm.xml"/>
</session-factory>
</hibernate-configuration>
Program.java
程序.java
public class Program {
public static void main(String[] args) {
System.out.println("Hello World!");
Session session = HibernateUtilities.getSessionFactory().openSession();
session.beginTransaction();
User user = new User();
user.setName("Joe");
user.setGoal(250);
session.save(user);
session.getTransaction().commit();
session.close();
HibernateUtilities.getSessionFactory().close();
}
}
User.hbm.xml
用户名.hbm.xml
<?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 Oct 17, 2015 11:44:47 AM by Hibernate Tools 3.5.0.Final -->
<hibernate-mapping>
<class name="com.simpleprogrammer.User" table="USERS">
<id name="id" type="int">
<column name="ID" />
<generator class="identity" />
</id>
<property name="name" type="java.lang.String">
<column name="NAME" />
</property>
<property name="total" type="int">
<column name="TOTAL" />
</property>
<property name="goal" type="int">
<column name="GOAL" />
</property>
</class>
</hibernate-mapping>
User.java
用户.java
package com.simpleprogrammer;
public class User {
private int id;
private String name;
private int total;
private int goal;
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;
}
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;
}
}
HibernateUtilities.java
HibernateUtilities.java
package com.simpleprogrammer;
import org.hibernate.HibernateException;
import org.hibernate.SessionFactory;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;
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 exception) {
System.out.println("Problem creating session factory!");
}
}
public static SessionFactory getSessionFactory() {
return sessionFactory;
}
}
回答by Coli
LinhSaysHi, I've executed your code with Hibernate 5 and I have the exact same error. I've executed it with Hibernate 4 and there is no problem.
LinhSaysHi,我已经用 Hibernate 5 执行了你的代码,但我遇到了完全相同的错误。我已经用 Hibernate 4 执行了它,没有问题。
The tutorial on Pluralsight has been created for Hibernate 4. Here is a session factory builder that works with Hibernate 5:
Pluralsight 教程是为 Hibernate 4 创建的。 这是一个与 Hibernate 5 一起使用的会话工厂构建器:
public class HibernateUtilities_5 {
private static final SessionFactory sessionFactory = buildSessionFactory();
private static SessionFactory buildSessionFactory() {
try {
StandardServiceRegistry standardRegistry = new StandardServiceRegistryBuilder()
.configure("hibernate.cfg.xml").build();
Metadata metadata = new MetadataSources(standardRegistry).getMetadataBuilder().build();
return metadata.getSessionFactoryBuilder().build();
} catch (HibernateException he) {
System.out.println("Session Factory creation failure");
throw he;
}
}
public static SessionFactory getSessionFactory() {
return sessionFactory;
}
}
回答by Deepak
I also faced the same error while trying it out with Hibernate 5.1.1. But I resolved it by replacing ServiceRegistry interface with StandardServiceRegistryBuilder and used "metadatasources" to create session factory. Please see my code below
在尝试使用 Hibernate 5.1.1 时,我也遇到了同样的错误。但是我通过用 StandardServiceRegistryBuilder 替换 ServiceRegistry 接口并使用“元数据源”来创建会话工厂来解决它。请看下面我的代码
static
{
try
{
//Configuration configuration = new Configuration().configure();
standardServiceRegistry = new StandardServiceRegistryBuilder().configure("hibernate.cfg.xml")
.build();
Metadata metadata = new MetadataSources(standardServiceRegistry)
.getMetadataBuilder().build();
sessionFactory = metadata.getSessionFactoryBuilder().build();
}catch(HibernateException exception)
{
System.out.println("problem creating session factory!");
}
}
public static SessionFactory getSessionFactory(){
return sessionFactory;
}
I made these changes and it worked like a charm. please make changes in your code to the way you load the configuration file and try it again. Let me know if you still face hurdles.
我进行了这些更改,效果非常好。请在您的代码中更改加载配置文件的方式,然后重试。如果您仍然面临障碍,请告诉我。
回答by user5528931
Please check the schema name that you created in MySQL and the one specied in hibernate.cfg file.It was mismatching for me and i was getting same issue.
请检查您在 MySQL 中创建的架构名称以及在 hibernate.cfg 文件中指定的架构名称。它对我来说不匹配,我遇到了同样的问题。
Also modify connection url like below and remove the default schema field from hibernate.cfg. jdbc:mysql://localhost:3306/protein_tracker
还要像下面一样修改连接 url 并从 hibernate.cfg 中删除默认架构字段。jdbc:mysql://localhost:3306/protein_tracker
this worked for me.
这对我有用。
回答by kanwar prince raghav
Change the code as per Hibernate 5
根据 Hibernate 5 更改代码
static
{
try {
//Configuration configuration = new Configuration().configure();
serviceRegistry = new
StandardServiceRegistryBuilder().configure("hibernate.cfg.xml")
.build();
Metadata metadata = new MetadataSources(serviceRegistry)
.getMetadataBuilder().build();
sessionFactory = metadata.getSessionFactoryBuilder().build();
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
}
public static SessionFactory getSessionFactory() {
return sessionFactory;
}
give the give full class path in user.hbm.xml
在 user.hbm.xml 中给出完整的类路径
<class name="com.simpleprogrammer.Users" table="USERS">
map the resource in hibernate.cfg.xml
映射 hibernate.cfg.xml 中的资源
<mapping resource="com/simpleprogrammer/Users.hbm.xml"/>
and execute the following code
并执行以下代码
Session session = HibernateUtilities.getSessionFactory().openSession();
session.beginTransaction();
Users user = new Users();
user.setuserName("Prince");
user.setGoal(100);
user.setId(101);
user.setTotal(10);
session.save(user);
session.getTransaction().commit();
session.close();
HibernateUtilities.getSessionFactory().close();
回答by ABODE
The mapping is having a little issue. Make sure the path you specified is correct. When i had same issue, i only re-modified my mapping in the hibernate.cfg.xml to
映射有一个小问题。确保您指定的路径正确。当我遇到同样的问题时,我只将 hibernate.cfg.xml 中的映射重新修改为
<mapping class="com.simpleprogrammer.User"/>
Other attribute like resource were not added
未添加资源等其他属性
回答by Manish
there is problem with Hibernate jars... here i can see u are using the Hibernate 4....for developing the project... so add the hibernate 4.3.5 jar it should work.........
Hibernate jars 有问题......在这里我可以看到你正在使用 Hibernate 4......用于开发项目......所以添加 Hibernate 4.3.5 jar 它应该可以工作......
if u are not working with metadata than better to use hibernate 4.3 jar
如果你不使用元数据,那么最好使用 hibernate 4.3 jar
回答by johncus
I used your example and was able to get it to work with a few minor tweaks.
我使用了你的例子,并能够通过一些小的调整让它工作。
Verified that User.hbm.xml was located in src/main/resources/com/simpleprogrammer. Changed to lowercase table="users"
验证 User.hbm.xml 位于 src/main/resources/com/simpleprogrammer。改为小写table="users"
Then in hibernate.cfg.xml:
然后在 hibernate.cfg.xml 中:
- removed the
name=""
attribute from session-factory. - added a
<property name="hibernate.connection.password">SomePassword</property>
- added
<property name="hibernate.hbm2ddl.auto">create</property>
name=""
从会话工厂中删除了该属性。- 添加了一个
<property name="hibernate.connection.password">SomePassword</property>
- 添加
<property name="hibernate.hbm2ddl.auto">create</property>