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

异常如下:

这里写图片描述
测试代码:

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;
    }

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值