您的位置:首页 > 其它

HIbernate 5 测试连接出现的 Unknown entity异常

2017-03-06 17:42 363 查看
异常如下:



测试代码:

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.boot.registry.StandardServiceRegistry;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.cfg.Configuration;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

import com.jxust.model.Category;

/**
* 测试HIbernate
*
* @author Peng
* @Date2017年3月6日下午4:09:22
*/
public class TestHibernate {

private SessionFactory sessionFactory;
private Session session;
private Transaction transaction;

@Before
public void init() {
// 创建配置对象
Configuration cfg = new Configuration().configure();
// 创建服务注册对象
StandardServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder()
.applySettings(cfg.getProperties()).build();
// 创建会话工厂对象
sessionFactory = cfg.buildSessionFactory(serviceRegistry);
// 会话对象
session = sessionFactory.openSession();
// 开启事务
transaction = session.beginTransaction();

}

@After
public void destory() {
transaction.commit();// 提交事务
session.close();// 关闭对话
sessionFactory.close();// 关闭会话工厂
}

@Test
public void test() {
Category c = new Category();
c.setId(232323);
c.setType("衣服");
c.setHot(true);
session.save(c);
}
}


下面是获取 Hibernate5 sessionFactory 的正确代码

private SessionFactory sessionFactory;
private Session session;
private Transaction transaction;

@Before
public void init() {
//创建配置对象
Configuration cfg = new Configuration().configure("hibernate.cfg.xml");
// 创建会话工厂对象
sessionFactory = cfg.buildSessionFactory();
// 会话对象
session = sessionFactory.openSession();
// 开启事务
transaction = session.beginTransaction();

}
.....


org.hibernate.MappingException: Unknown entity: com.jxust.model.Category
at org.hibernate.internal.SessionFactoryImpl.getEntityPersister(SessionFactoryImpl.java:783)
at org.hibernate.internal.SessionImpl.getEntityPersister(SessionImpl.java:1520)
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:679)
at org.hibernate.internal.SessionImpl.save(SessionImpl.java:671)
at org.hibernate.internal.SessionImpl.save(SessionImpl.java:666)
at com.jxust.TestHibernate.test(TestHibernate.java:56)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)


HIbernate 的版本为5.0.11

<!--hibernate 包 -->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>5.0.11.Final</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>5.2.4.Final</version>
</dependency>
<dependency>
<groupId>org.hibernate.common</groupId>
<artifactId>hibernate-commons-annotations</artifactId>
<version>5.0.1.Final</version>

</dependency>
<dependency>
<groupId>org.hibernate.javax.persistence</groupId>
<artifactId>hibernate-jpa-2.1-api</artifactId>
<version>1.0.0.Final</version>
</dependency>


实体类

public class Category {
/**
* 主键
*/
private int id;
/**
* 类型名称
*/
private String type;
/**
* 类型是否为热点类型
*/
private boolean hot;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public boolean isHot() {
return hot;
}
public void setHot(boolean hot) {
this.hot = hot;
}
@Override
public String toString() {
return "Category [id=" + id + ", type=" + type + ", hot=" + hot + "]";
}

}


Category.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 2017-3-6 16:04:32 by Hibernate Tools 3.5.0.Final -->
<hibernate-mapping>
<class name="com.jxust.model.Category" table="CATEGORY">
<id name="id" type="int">
<column name="ID" />
<generator class="assigned" />
</id>
<property name="type" type="java.lang.String">
<column name="TYPE" />
</property>
<property name="hot" type="boolean">
<column name="HOT" />
</property>
</class>
</hibernate-mapping>


hibernate.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>
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.password">root</property>
<property name="hibernate.connection.url">jdbc:mysql://127.0.0.1:3306/shop</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>

<property name="show_sql">true</property>
<property name="format_sql">true</property>
<property name="hbm2ddl.auto">create</property>

<mapping resource="com/jxust/model/Category.hbm.xml"/>
</session-factory>
</hibernate-configuration>


获取sessionFactory 的一个模板

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

public class HibernateSessionFactory {

private static final ThreadLocal<Session> threadLocal = new ThreadLocal<Session>(); // sessionFactory中用的是线程池技术
private static org.hibernate.SessionFactory sessionFactory; // sessionFactory:创建session的工厂

private static Configuration configuration = new Configuration();

static { // 类加载时初始化sessionFactory
try {
configuration.configure();
sessionFactory = configuration.buildSessionFactory(); //HIbernate 5 获取sessionFactory的方式
} catch (Exception e) {
System.err.println("%%%% Error Creating SessionFactory %%%%");
e.printStackTrace();
}
}

private HibernateSessionFactory() { // 私有构造方法阻止new出对象,保证sessionFactory的单例
}

public static Session getSession() throws HibernateException {
Session session = (Session) threadLocal.get(); // 从线程池中拿session

if (session == null || !session.isOpen()) { // 如果线程池是空的,或者session打开失败
if (sessionFactory == null) {
rebuildSessionFactory(); // 如果sessionFactory是空的,那就再创建一次,和static部分一样的
}
session = (sessionFactory != null) ? sessionFactory.openSession() : null; // sessionFactory不为空就创建一个session
threadLocal.set(session); // 然后把这个session放到线程池中,下次再拿
}

return session;
}

public static void rebuildSessionFactory() {
try {
configuration.configure();
sessionFactory = configuration.buildSessionFactory();
} catch (Exception e) {
System.err.println("%%%% Error Creating SessionFactory %%%%");
e.printStackTrace();
}
}

public static void closeSession() throws HibernateException {
Session session = (Session) threadLocal.get();
threadLocal.set(null);

if (session != null) {
session.close();
}
}

public static org.hibernate.SessionFactory getSessionFactory() {// 提供一个公共接口让外界获得这个单例sessionFactory
return sessionFactory;
}

public static Configuration getConfiguration() {
return configuration;
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  hibernate 异常
相关文章推荐