1、,一对一的实体映射实现,杨少波,,中科院计算所职业培训中心,1、Hibernate框架的强大不仅仅体现在对JDBC的数据访问操作的“简化”方面,其O/R Mapping(对象/关系的映射)的功能才是Hibernate的精华部分,对象/关系的映射(O/R Mapping),2、Hibernate为什么要提供O/R Mapping技术(1)面向对象中的对象之间的关系有“关联、继承、聚合”等形式 (2)如何将在“域建模”中所获得的各个实体对象之间的关系也能够持久存储? (3)目前所应用的各种企业级的数据库系统还是关系形的数据库(4)因此需要一个中间的“桥梁”或者“适配器”类的东西来协调“面向对象”和
2、“面向关系”!,3、那Hibernate又是如何解决的? 让我们继续学习和了解吧!,一对一的实体映射实现,在本讲您能了解如下知识点“一对一”的关联映射原理实现“一对一”的关联映射创建Hibernate的配置文件。创建持久化类。创建对象-关系映射文件。编程基于Hibernate的DAO组件,1、一对一关联的实现方案(1)一对一关联在hibernate中有两种方式主键关联唯一外键关联,一、 “一对一”的关联映射原理,2、主键关联的实现原理:基于主键关联的单向一对一关联通常使用一个特定的id生成器foreign,3、主键关联的实现要求(1)主键关联不需要额外的表字段,如果对象是通过这种一对一关系相关
3、联的,那么这两对象所对应的数据库表就共享同样的主关键字值,所以如果我们希望两个对象通过主键一对一关联,我们必须确认它们被赋予同样的标识值!,(2)在映射文件中所应该注意的问题在“主键关联”中使用“foreign”表示与外键共享主键,也就是与Person实体共享主键 利用标签表示关联关系,同时在其中的“constrained”属性设定为true,则表示约束两个数据库表的主键数据相同,4、主键关联实现的基本过程(1)在主动方所在的持久类中加入一个被动方类的对象声明,(2)在主动方类的映射文件中利用标签表示关联关系,5、利用“主-外键”实现一对一的关联(1)实现的原理 在主动方的数据库表中加入外键进
4、行关联,这样主动方与被动方的映射关系实际上就成了多对一的关联。基于外键关联的单向一对一关联和单向多对一关联几乎是一样的。唯一的不同就是单向一对一关联中的外键字段具有唯一性约束。(2)对数据库表的设计要求在主动方的数据库表中应该有被动方的主键作为外键。,(4)注意标签时,加上“unique”属性来设定为具有唯一性约束。使用“唯一外键关联”来完成“一对一”的关联,其实就是限制“多对一”关系中,“多”的一方只能有一个参考至“一”的一方,也就是“多对一”关系的一个特例这可以在映像文件中使用标签时,加上“unique”属性来设定。,(3)在映射配置文件中中利用标签来说明关系,6、 “主-外键”的实现过程
5、(1)在主动方所在的持久类中加入一个被动方类的对象声明,(2)在主动方类的映射文件中利用标签表示关联关系,详细的实现过程请见后文,1、设计本示例中所需要的数据库,2、利用Hibernate连接数据库(1)方式一:采用JDBC的直接连接方式(2)方式二:采用基于容器的JNDI数据源的连接方式 本例采用Tomcat中所提供的JNDI的数据库连接池,二、在Web应用中实现本“一对一”的关联示例,4、将所需要的Hibernate系统库*.jar文件放到Web应用的/WEB-INF/lib目录中,3、在Tomcat的server.xml文件进行配置,请见文档中的详细内容,5、配置Hibernate系统,
6、(1)本例的XML格式的Hibernate数据库连接配置文件hibernate.cfg.xml文件的内容如下,注意:该文件的存放的位置应该是在Web应用的WEB-INF/classes目录中。,(2)配置log4j.properties属性文件,6、在Web应用所在的目录中添加z本例中所采用的数据库的JDBC驱动程序的各个*.jar包文件到WEB-INF/lib目录中,7、编写POJO类及其要求(1)POJO简单传统Java对象(POJO-Plain Old Java Object,有时候也称作Plain Ordinary Java Objects)编程模型Hibernate使用简单的Java
7、对象来进行持久化,从而达到轻量级的O/R Mapping框架的效果。 (2)POJO类代码的风格要求一个POJO很类似于JavaBean的代码风格并注意成员属性的命名规则并且它应该有一个没有参数的构造函数,(3)实体类中的标识属性 id实体类中的id 属性(property) 为一个实体类的实例提供标识属性(identifier property)的值它是一个特殊的属性,代表了这个类的数据库标识符(主键),(4)本例中的实体类代码,请见文档中的详细代码,(5)实体类中的equals方法,注意:如果我们有如下需求,则必须重载 equals()方法。 想把持久类的实例放入Set中(当表示多值关联时
8、,推荐这么做) 想重用脱管实例 实现equals()最显而易见的方法是比较两个对象标识符的值。如果值相同,则两个对象对应于数据库的同一行,因此它们是相等的(如果都被添加到 Set,则在Set中只有一个元素)。,8、映射前面所设计的EBook数据库表(1)映射文件的作用Hibernate需要知道怎样去加载(load)和存储(store)我们的持久化类的对象。这里正是Hibernate映射文件(mapping file)发挥作用的地方映射文件告诉Hibernate它应该访问数据库里面的哪个表(table)和应该使用表里面的哪些字段(column)。,(2)命名规则:类名.hbm.xml(3)本示例
9、中的EBook.hbm.xml映射文件的内容,9、编程基于Hibernate的DAO组件以进行数据的访问操作,详细的代码请见文档。,10、在某个Web应用中使用上面的程序,11、部署并执行该Web应用,(1)讲发现在数据库表中出现下面的记录,表明已经添加了数据,(2)另外,在状态提示中,也可以看到下面的内容,(2)在MS SQLServer的本例的数据库中增加一个数据库表Publish,12、采用“主键关联”实现本例中的“一对一”实体之间的关联(1)问题:决定EBook和Publish之间的关系显然,EBook是由某个出版社所出版,即EBook与Publish之间为“一对一”的关系。其中的EB
10、ook类为主控方,而Publish类为被动方。,(3)在本Web应用中再新增一个Publish实体类以表示关联的被动方,(4)为该实体类创建一个Publish.hbm.xml映射文件,(6)在EBook.hbm.xml中映射“one-to-one”关联,(5)在hibernate.cfg.xml配置文件中增加对该文件的定义,(7)修改Ebook.java类增加一个Publish类型的成员属性,(8)根据EBook获得其关联的Publish(9)执行该Web应用,讲能够看到下面的输出结果,三、开发要点,1、根标签中的各个属性的了解2、映射定义文件中的子标签的各个属性的了解3、映射定义文件的子标签
11、的了解4、映射定义文件的子标签的了解 5、映射定义文件的子标签的了解6、“unsaved-value”的含义7、数据库表的主键设计要点,8、Hibernate中对Session管理(1)利用ThreadLocal 模式实现对Session的管理(2)利用Filter组件来管理Session9、利用ThreadLocal 模式实现对Session的管理(1)ThreadLocal 模式,(2)ThreadLocal类的定义,(3)主要的成员方法,(4)代码示例-请参考HibernateUtil.java类,10、对Session的管理应该应用“线程安全”(1)为什么要对Session管理应用“线
12、程安全”,(2)未考虑“线程安全”的应用示例,(3)为什么应用ThreadLocal能够实现对Session管理应用“线程安全”,11、利用Filter组件来管理Session 具体可以参考“一对多的实体映射实现”的文档。,12、Hibernate的映射类型是如何跨数据库平台的?(1)ANSI-标准SQL类型,(2)实现的基本原理,在程序运行时,Java应用通过Hibernate访问数据库,而Hibernate又通过JDBC驱动程序访问数据库。JDBC驱动程序对底层数据库使用的SQL类型进行了封装,向上提供标准SQL类型接口,使得Hibernate可以使用标准SQL类型来生成DML。,本讲内容。,孔子说:“学而不思则罔,思而不学则殆。”,