• Hibernate5.0.2 Unknown Entity 如何创建SessionFactory


    最近在学习Hibernate,因为有被非官方软件坑的经历,就去官网下载了最新版本(5.0.2)的HIbernata框架,兴致勃勃地开始跟着视频敲代码,没想到。。这就是个坑啊!

    废话不多说,上代码

    //实体类(entity/Student.java)
    
    public class Student {
    	private int sid;
    	private String sname;
    //Constructors
    //Setters and Getters
    }

    //hibernate.cfg.xml(src目录下)
    
    <?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><pre name="code" class="java">	<session-factory>
    		<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
    		<property name="connection.url">jdbc:mysql://localhost:3306/goods</property>
    		<property name="connection.username">root</property>
    		<property name="connection.password">123456</property>
    		<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
    		<property name="show_sql">true</property>
    		<property name="hbm2ddl.auto">create</property>
    		
    		<mapping resource="entity/Student.hbm.xml"/>
    	</session-factory>
    
    </hibernate-configuration>
    
    

    <pre name="code" class="java">//Student.hbm.cfg(entity包下)
    
    <?xml version="1.0" encoding="utf-8"?>
    <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
    
    <hibernate-mapping>
    
        <class name="entity.Student" table="student">
            <id name="sid" type="java.lang.Integer">
                <column name="sid" />
                <generator class="assigned" />
            </id>
            <property name="sname" type="java.lang.String">
                <column name="sname" length="20" not-null="true" />
            </property>
        </class>
        
    </hibernate-mapping>
    
    
    这是为了说明问题简化的代码,基本上没有废话了,在以上环境下,我使用老版本的Hibernate创建会话工厂的方法分别进行测试,代码如下
    

    	//原始版(还有一个更原始的由configuration直接build的方法,目测已经没有多少人在用了,就不多再赘述)	
    	public static void main(String[] args){
    	
    		Configuration config = new Configuration().configure();
    		//区别之处
    		ServiceRegistry serviceRegistry = new ServiceRegistryBuilder()
    				.applySettings(config.getProperties()).buildServiceRegistry();
    		
    		SessionFactory sessionFactory = config.buildSessionFactory(serviceRegistry);
    		Session session = sessionFactory.openSession();
    		Transaction transaction = session.beginTransaction();
    		Student s = new Student(1, "小明");
    		session.save(s);
    		transaction.commit();
    	}

    	//最近版(我使用的MyEclipse集成的Hibernate4.1.4就是这样创建的,这也是我栽跟头的地方!!)
    	public static void main(String[] args) {
    		
    		Configuration config = new Configuration().configure();
    		//区别之处
    		ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder()
    				.applySettings(config.getProperties()).build();
    		
    		SessionFactory sessionFactory = config.buildSessionFactory(serviceRegistry);
    		Session session = sessionFactory.openSession();
    		Transaction transaction = session.beginTransaction();
    		Student s = new Student(1, "小明");
    		session.save(s);
    		transaction.commit();
    	}

    	//最新版(Hibernate 5.0.2)
    	public static void main(String[] args) {
    		
    		ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().configure().build();
    		SessionFactory sessionFactory = new MetadataSources(serviceRegistry)
    				.buildMetadata().buildSessionFactory();
    		Session session = sessionFactory.openSession();
    		Transaction transaction = session.beginTransaction();
    		Student s = new Student(1, "小红");
    		session.save(s);
    		transaction.commit();
    	}

    当我使用Hibernate 4.1.4时,第一版代码是可以跑的,更换jar包后第一版代码报错,4.1.4中的ServiceRegistryBuilder类在5.0.2中被删除了,而在我学习的视频讲解中,使用的是第二版代码(StandardServiceRegistryBuilder   balabala..),最气人的是,这一版代码原封不动地copy到5.0.4环境下,编译器是不会报错的!!!但是一旦程序跑起来……

    Exception in thread "main" org.hibernate.MappingException: Unknown entity: entity.Student
    	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 entity.Test.main(Test.java:43)
    
    我敢打赌,这个异常我今天至少看了100遍 /(ㄒoㄒ)/~~

    最初我一直在自己的XML中排错
    <pre name="code" class="java"><mapping resource="entity/Student.hbm.xml"/>

    
    根据控制台的打印信息,这一行是我怀疑的重中之重,其间换过数据库,换过主键生成策略,甚至换过DTD都无济于事,问度娘,搜到的基本上都是
    

    1.使用@Entity注解时引的包不对

    2.mapping resource标签填写有误

    针对以上两点多次修改后仍旧是相同的错误,为了更清晰地暴露问题,我去掉了非关键代码,并删除注解,甚至一度怀疑官方给的required文件夹不全,通过控制台打印的信息去读Hibernate 5.0.2源码(这辈子再也不想看第二回),去反编译4.1.4的class文件,最后。。。放弃了。

    但是谁能想到山穷水尽的时候又见柳暗花明呢,就在我准备关掉Firefox所有的标签页,老老实实地用4.1.4继续学习的时候,发现有一个标签还没仔细看过。

    点击打开链接

     官方给的hibernate5新特性,长的看不到头的滚动条,满满的英文……其实这个页面我也打开过好几次,但都因为毅力不够放弃了,这回抱着死马当活马医的心态,耐着性子读了下去,竟然给我看见了

    Obtaining the org.hibernate.SessionFactory

    这等好东西,大业遂成。


    --------------以下是我昨天夜里尝试排错几个小时后无果,匆忙之下写的,

    --------------到现在,一天过去了,问题终于得到解决,可以安睡了-----------------------

    4.1.2中的ServiceRegistryBuilder类在5.0.2中被删除了,取而代之的是StandardServiceRegistryBuilder两者的使用存在差异,暂时还没有找到解决办法,和今天下午配置MYSQl库出现的问题有颇有共性,新版本也许确实有许多优化,但不一定要立刻拿来用,因为这些个破版本差异,今天一晚上都搭进去了,以后遇到类似问题要首先考虑版本问题。

  • 相关阅读:
    解决 “页面中文字增多,字号突然变大” 的问题
    Seajs的用法
    clientWidth、clientHeight、offsetWidth、offsetHeight以及scrollWidth、scrollHeight
    页面中文字增多,字号会突然变大
    flex的使用实例
    移动端弹窗滚动时window窗体也一起滚动的解决办法
    display:inline-block带来的问题及解决办法
    sql 整理积累
    T-SQL建索引
    php json_encode在CI框架中的使用细节
  • 原文地址:https://www.cnblogs.com/iny7/p/5106597.html
Copyright © 2020-2023  润新知