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库出现的问题有颇有共性,新版本也许确实有许多优化,但不一定要立刻拿来用,因为这些个破版本差异,今天一晚上都搭进去了,以后遇到类似问题要首先考虑版本问题。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 3D Slicer5.0.2是一款开源的医疗影像处理软件,专门用于医学图像的分析、处理和可视化。它是一款非常先进的医学图像分析软件,可以快速地处理各种类型的医学图像数据,包括MRI、CT、普通X光等等。 3D Slicer5.0.2具有很强的交互性和可视性,支持多种不同的图像处理算法,例如分割、配准、重建等。此外,它还提供了广泛的可扩展性,可以通过添加其他功能模块和应用程序进行自定义。这些功能模块涵盖了多种领域,例如单元分析、医学机器人、化学成像等等。 3D Slicer5.0.2非常易于使用,对于医疗图像处理新手来说非常友好。它提供了基于图形用户界面的分析环境,用户只需要简单地拖拽和点击就可以完成复杂的图像处理操作。同时它还提供了可视化预览方式,方便用户检查图像处理效果。 总之,3D Slicer5.0.2是一款非常强大、灵活和易于使用的医学图像处理软件,它可以广泛应用于医学图像处理和医学研究领域。 ### 回答2: 3D Slicer5.0.2 是一款功能强大的医学影像处理软件,主要用于医学图像分析、可视化和3D重建等方面的研究。它的前身是Slicer3,是由美国国家卫生研究院(NIH)资助的一项开源项目,现已成为全球领先的医学图像处理软件之一。 3D Slicer5.0.2提供了多种处理医学图像的选项,包括DICOM格式图像的读取、处理和重建,针对肿瘤、神经系统等特定部位的图像处理,以及对大脑活动和血管成像的研究等。此外,该软件还支持多种数据格式,如NIFTI、MRI、CT等。 3D Slicer5.0.2拥有丰富的功能,例如图像导入、分割、编辑、可视化、分析、可视化、3D打印等。它的3D可视化功能非常强大,可以实时渲染医学图像并展示3D立体效果,同时将体素进行三维重建和可视化。此外,该软件还提供了许多临床研究工具,如自动脑结构分割、进行放疗计划等。 此外,3D Slicer5.0.2是一个开源软件,可在多个操作系统中自由使用,例如Windows,Mac和Linux等,并且社区提供了大量的插件和工具,以满足各种不同的研究需求。 总之,3D Slicer5.0.2是一款功能强大的医学影像处理工具。它提供了多种功能强大的工具,可以用于医学图像的分割、编辑、可视化和分析。此外,它的开源和跨平台特性使其成为医学图像处理领域中的顶尖软件之一。 ### 回答3: 3D Slicer是一款免费的开源软件,旨在为医学图像处理提供强大的支持。其最新版本为3D Slicer5.0.2,它具有强大的功能和可靠的性能。 首先,3D Slicer5.0.2支持高品质的医学图像重建和分析。它可以处理MRI,CT和PET等多个类型的医学图像,并提供各种可视化和测量工具,以帮助医生确定疾病的发展和治疗方案。 其次,3D Slicer5.0.2具有良好的扩展性和可定制性。用户可以自定义功能模块,添加插件和扩展程序,以满足特定的应用需求。这使得3D Slicer5.0.2在处理特定病例的时候更加有效。 另外,3D Slicer5.0.2支持多种操作系统,包括Windows,Linux和Mac OS X等。用户可以根据自己的需求选择适合自己的操作系统。 最后,3D Slicer5.0.2是一款开源软件,可以通过开源社区获得支持和更新。这意味着用户可以在不断改进和优化的基础上获得更好的使用体验。 总之,3D Slicer5.0.2是一款功能强大,可靠性高的医学图像处理软件,其强大的功能和可定制性,使其成为医学领域的重要工具。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值