




已阅读5页,还剩48页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
对象/关系映射Hibernate,最低要求:熟悉Java、SQL、JDBC,掌握面向对象的开发方法,并有实际项目开发经验课程目标:理解O/RMapping原理,掌握Hibernate开发的相关知识,并能使用Hibernate进行实际项目开发,目录,一、持久化层O/RMapping二、Hibernate入门三、Hibernate映射申明(Mappingdeclaration)四、持久化对象的状态和生命周期五、Hibernate查询六、Hibernate最佳实践,一、持久化层O/RMapping,基于B/S的典型三层架构,如何分层?业务逻辑层和持久化层绝不要依赖于展现层。使用假设法测试。例子:1、一个显示课程考试分数的列表。现在要将不及格的分数用红色字体显示(低于60分)。2、搜索。,如何进行对象关系数据库的匹配,publicclassUserprivateStringname;privateStringpassword;privateListaddress;createtabletbl_user(namevarchar(255)notnull,passwordvarchar(255),.primarykey(name),如何进行对象关系数据库的匹配?,对象关系数据库的不匹配范式,粒度(granularity)的问题子类型(subtypes)的问题同一性(identity)的问题与关联(associations)有关的问题对象结构导航(navigation)的问题范式不匹配的代价花费很多时间和精力来手工实现对象和关系的匹配。甚至要扭曲对象模型直到它与下层的关系技术匹配为止。JDBCAPI本身的问题。JDBC和SQL提供了一个面向语句(即命令)的方法从SQL数据库中来回移动数据。至少在三个时刻(Insert,Update,Select)必须指定一个结构化关系,这增加了设计和实现所需要的时间。,基于关系数据库的持久层可选方案,基于关系数据库的持久层可选方案,O/RMapping-What?Why?,什么是O/RMapping?对象-关系映射是一门非常实用的工程技术,它实现了Java应用中的对象到关系数据库中的表的自动的(和透明的)持久化,使用元数据(metadata)描述对象与数据库间的映射。,O/RMapping的优点提高生产率(Productivity)可维护性(Maintainability)更好性能(Performance)厂商独立性(Vendorindependence),二、Hibernate入门,Hibernate概述Hibernate是非常优秀、成熟的O/RMapping框架。它提供了强大的对象和关系数据库映射以及查询功能。Hibernate优势开源(LGPL)成熟流行(约13000downloads/month)自定义APIJBoss将用Hibernate3实现EntityBeans,Hibernate开发步骤,一、持久化类的设计二、持久化类和关系数据库的映射三、应用的开发,持久化Java类必须遵循的原则,为类的持久化类字段申明访问方法(get/set)。Hibernate对JavaBeans风格的属性实行持久化。实现一个默认的构造方法(constructor)。这样的话Hibernate就可以使用Constructor.newInstance()来实例化它们。如果是集合类型的属性,它的类型必须定义为集合的接口。例如:List、Set。提供一个标识属性(identifierproperty)。如果没有该属性,一些功能不起作用,比如:级联更新(Cascadedupdates)Session.saveOrUpdate()。,持久化类和关系数据库的映射,XDoclet:它通过在Java源代码中加入特定的JavaDoctag,从而为其添加特定的附加语义,之后通过XDoclet工具对代码中JavaDocTag进行分析,自动生成与代码对应的配置文件(,Middlegen:从数据库中已有的表结构中生成Hibernate映射文件。当前版本是2.1可以去http:/boss.bekk.no/boss/middlegen下载。,Hibernate核心接口,Configuration,概述:Configuration类负责管理Hibernate的配置信息。它包括如下内容:Hibernate运行的底层信息:数据库的URL、用户名、密码、JDBC驱动类,数据库Dialect,数据库连接池等。Hibernate映射文件(*.hbm.xml)。Hibernate配置的两种方法:属性文件(perties)。调用代码:Configurationcfg=newConfiguration();Xml文件(hibernate.cfg.xml)。调用代码:Configurationcfg=newConfiguration().configure();,Configuration例子,数据库连接的配置hibernate.dialectnet.sf.hibernate.dialect.MySQLDialecthibernate.connection.driver_classcom.mysql.jdbc.Driverhibernate.connection.urljdbc:mysql:/localhost/hibernatehibernate.connection.usernameroothibernate.connection.password数据库连接池的配置DBCP(AppServer连接池首选)vider_classnet.sf.hibernate.connection.DBCPConnectionProvider配置DBCP连接池其它hibernate.show_sqltruehibernate.jdbc.fetch_size50hibernate.jdbc.batch_size25,SessionFactory,概述:应用程序从SessionFactory(会话工厂)里获得Session(会话)实例。它在多个应用线程间进行共享。通常情况下,整个应用只有唯一的一个会话工厂例如在应用初始化时被创建。然而,如果你使用Hibernate访问多个数据库,你需要对每一个数据库使用一个会话工厂。会话工厂缓存了生成的SQL语句和Hibernate在运行时使用的映射元数据。调用代码:SessionFactorysessionFactory=cfg.buildSessionFactory();,Session(会话),概述:Session不是线程安全的,它代表与数据库之间的一次操作,它的概念介于Connection和Transaction之间。Session也称为持久化管理器,因为它是与持久化有关的操作接口。Session通过SessionFactory打开,在所有的工作完成后,需要关闭。它与Web层的HttpSession没有任何关系。调用代码Sessionsession=sessionFactory.openSession();,Transaction(事务),概述:它将应用代码从底层的事务实现中抽象出来这可能是一个JDBC事务,一个JTA用户事务或者甚至是一个公共对象请求代理结构(CORBA)允许应用通过一组一致的API控制事务边界。这有助于保持Hibernate应用在不同类型的执行环境或容器中的可移植性。调用代码:Transactiontx=session.beginTransaction();注:使用Hibernate进行操作时(增、删、改)必须显示的调用Transaction(默认:autoCommit=false)。,Query,概述:Query(查询)接口允许你在数据库上执行查询并控制查询如何执行。查询语句使用HQL或者本地数据库的SQL方言编写。调用代码:Queryquery=session.createQuery(“fromUser”);,用户的例子,持久化类User.javapublicclassUserprivateLongid;privateStringname;privateDatebirthday;privateStringemail;publicUser()publicUser(Stringname,Datebirthday,Stringemail).Get/Set,映射文件User.hbm.xml,应用UserTest.java,publicvoidtestCreate()throwsExceptionConfigurationcfg=newConfiguration();cfg.addURL(UserTest.class.getResource(/com/test/um/User.hbm.xml);SessionFactorysessionFactory=cfg.buildSessionFactory();Sessionsession=sessionFactory.openSession();Transactiontx=session.beginTransaction();SimpleDateFormatformat=newSimpleDateFormat(yyyy-mm-dd);Useruser=newUser(Jack,format.parse(1980-04-12),Jack);session.save(user);mit();assertNotNull(user.getId();session.clear();Useruser_2=(User)session.get(User.class,user.getId();assertNotNull(user_2);session.close();,应用UserTest.java,保存用户:session.save(user);修改用户:session.update(user);保存或修改用户:session.saveOrUpdate(user);删除用户:session.delete(user);删除所有用户:session.delete(“fromUser”);查询用户名为“test”的用户:Queryquery=session.createQuery(fromU=:name);query.setParameter(“test,user.getName();UserfindUser=(User)query.list().get(0);,三、Hibernate映射申明(Mappingdeclaration),hibernate-mapping一、类层次。class1、主键。id2、基本类型。property3、自定义类。many-to-one|one-to-one4、集合。set|list|map|array4.1、one-to-many4.2、many-to-many5、子类。subclass|joined-subclass6、其它。component|any等二、查询语句。Query说明:一个Hibernate-mapping中可以同时定义多个类。Query非常简单,主要是用来放置查询语句,便于对数据库查询的统一管理和优化。,hibernate-mapping,(1)、schema(可选):数据库SchemaName(2)、default-cascade(可选,默认为none):默认的级联风格(3)、auto-import(可选,默认为true):是否在查询中只使用类名。不用加package名字。(4)、package(可选),如果该映射文件中定义的类名不包含package,则使用这里定义的package作为类名的前缀。,一、类层次class,1、主键-id,(1)、name(可选):标识属性的名称。(2)、type(可选):标识Hibernate类型的名字。(3)、column(可选默认为属性名):对应数据库表的主键字段的名字。(4)、unsaved-value(可选默认为null):这个值用来判断对象是否要保存。,1.1主键生成策略generator,generator主键生成器,每个主键都必须定义相应的主键生成策略。它用来为持久化类实例生成唯一的标识。Hibernate内置的主键生成策略数据库提供的主键生成机制。identity、sequence(序列)。外部程序提供的主键生成机制。increment(递增),hilo(高低位),seqhilo(使用序列的高低位),uuid.hex(使用了IP地址+JVM的启动时间(精确到1/4秒)+系统时间+一个计数器值(在JVM中唯一)),uuid.string。其它。native(本地),assigned(手工指定),foreign(外部引用)。,2、基本类型property,(4)update,insert(可选-默认为true):表明在用于UPDATE和/或INSERT的SQL语句中是否包含这个字段。(5)formula(可选):一个SQL表达式,定义了这个计算(computed)属性的值。计算属性没有和它对应的数据库字段。,3.1、自定义类many-to-one,(3)class(可选-默认是通过反射得到属性类型):关联的类的名字。(4)cascade(级联)(可选):指明哪些操作会从父对象级联到关联的对象。(5)outer-join(外连接)(可选-默认为自动)hibernate.use_outer_join(7)property-ref:(可选)指定关联类的一个属性,这个属性将会和本外相对应。,例子:User-Group,3.2、自定义类one-to-one,一对一关联:主键关联和惟一外键关联两种方式。例子:User-IdCard(外键关联),4、集合Set,(1)name集合属性的名称(2)table(可选)目标关联数据库表(3)lazy(可选默认为false)允许延迟加载(lazyinitialization)(4)inverse(可选默认为false)标记有哪一方来维护关联关系(双向关联中使用)。(5)cascade(可选默认为none)让操作级联到子实体(6)order-by(可选,仅用于jdk1.4)指定表的字段(一个或几个)再加上asc或者desc(可选),定义Map,Set和Bag的迭代顺序(7)where(可选)指定任意的SQLwhere条件(8)outer-join(可选-默认为auto)是否使用外联接,4.1、one-to-many,概念:一对多关联直接连接两个类对应的表,而没有中间集合表。(实现了一个一对多的关系模型,例如:User-Address)这里的Java集合必须满足下面的语义:map,set或list中不能包含null值一个被包含的实体的实例只能被包含在一个集合的实例中(1)class(必须):被关联类的名称。,例子(one-to-many):User-Address,4.2、many-to-many,(1)column(必需):中间映射表中,关联目标表的关联字段(2)class(必需):类名,关联目标类(3)outer-join(可选-默认为auto)(1)(1)column(必需):当前表的关联字段,例子(manytomany):student-trainClass,5、继承,继承实现的三中策略单表继承。每棵类继承树使用一个表(tableperclasshierarchy)具体表继承。每个子类一个表(tablepersubclass)类表继承。每个具体类一个表(tableperconcreteclass)(有一些限制)单表继承,例子(继承):user-student,双向关联,概念:双向关联允许通过关联的任一端访问另外一端。在Hibernate中,支持两种类型的双向关联。一对多(one-to-many),Set或者bag值在一端,单独值(非集合)在另外一端。多对多(many-to-many),两端都是set或bag值。,例子(双向关联):group-user,例子:从Java代码看group-user双向关联的inverse,概念:inverse用来标识双向关联的关联关系由哪一端维护。默认inverse的值为false,由主动方负责维护关联关系;如果设为true,则由反向一端维护关联关系。用例:我们假设已经有一个Group类的实例:adminGroup,现在我们要新增一个用户,并且将用户分配到adminGroup中。inverse=“false”,由主动方Group负责维护group-user的关联关系.Useruser=newUser(“Jak”);adminGroup.getUsers.add(user);session.save(user);session.update(group);inverse=“true”,由Group的反向段User负责维护关联关系。Useruser=newUser(“Jak”);user.setGroup(adminGroup);session.save(user);,四、持久化对象的状态,瞬时对象(TransientObjects):使用new操作符初始化的对象不是立刻就持久的。它们的状态是瞬时的,也就是说它们没有任何跟数据库表相关联的行为,只要应用不再引用这些对象(不再被任何其它对象所引用),它们的状态将会丢失,并由垃圾回收机制回收。持久化对(PersistObjects):持久实例是任何具有数据库标识的实例。它有持久化管理器Session统一管理,持久实例是在事务中进行操作的它们的状态在事务结束时同数据库进行同步。当事务提交时,通过执行SQL的INSERT、UPDATE和DELETE语句把内存中的状态同步到数据库中。离线对象(DetachedObjects):Session关闭之后,持久化对象就变为离线对象。离线表示这个对象不能再与数据库保持同步,它们不再受Hibernate管理。,持久化对象的生命周期(lifecycle),Hibernate脏数据字段捡入,检索一个用户,并将它的用户名更改为“Mary”Sessionsession=sessionFactory.openSession();Transactiontx=session.beginTransaction();Useruser=(User)session.get(User.class,userId);user.setName(Mary);mit();session.close();,持久化对象必须唯一,一个Session中不能同时存在两个ID相同的持久化对象例如:id为userId的user_1对象已经存在Session中,这时如果Session中试图产生一个user_2对象!Sessionsession=sessionFactory.openSession();Transactiontx=session.beginTransaction();Useruser_1=(User)session.get(User.class,userId);Useruser_2=newUser(userId,”Mary”);session.update(user_2);最后将会产生异常:net.sf.hibernate.NonUniqueObjectException:adifferentobjectwiththesameidentifiervaluewasalreadyassociatedwiththesession解决办法:使用evict()方法将user_1实例从session中去除。session.evict(user_1);,五、Hibernate查询,概述:数据查询与检索是Hibernate中的一个亮点。相对其他ORM实现而言,Hibernate提供了灵活多样的查询机制。标准化对象查询(CriteriaQuery):以对象的方式进行查询,将查询语句封装为对象操作。优点:可读性好,符合Java程序员的编码习惯。缺点:不够成熟,不支持投影(projection)或统计函数(aggregation)Hibernate语言查询(HibernateQueryLanguage,HQL):它是完全面向对象的查询语句,查询功能非常强大,具备继承、多态和关联等特性。Hibernate官方推荐使用HQL进行查询。NativeSQLQueries(原生SQL查询):直接使用数据库提供的SQL方言进行查询。,例子:标准化对象查询(CriteriaQuery),简单例子:查询用户名以“J”开头的所有用户。Criteriacriteria=session.createCriteria(User.class);criteria.add(Expression.like(name,J%);Listusers=criteria.list();,Hibernate语言查询(HibernateQueryLanguage,HQL),HQL用面向对象的方式生成SQL以类和属性来代替表和数据列支持多态支持各种关联减少了SQL的冗余HQL支持所有的关系数据库操作连接(joins,包括Inner/outer/fulljoins),笛卡尔积(cartesianproducts)投影(projection)聚合(Aggregation,max,avg)和分组(group)排序(Ordering)子查询(Subqueries)SQL函数(SQLfunctioncalls),例子:Hibernate语言查询(HibernateQueryLanguage,HQL),简单例子:查询用户名以“J”开头的所有用户。Queryquery=session.createQuery(fromUlikeJ%);Listusers=query.list();复杂例子:从User和Group中查找属于“admin”组的所有用户。Queryquery=session.createQuery(“
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026中交一公局集团有限公司校园招聘备考考试题库附答案解析
- 2025山东临沂罗开控股集团有限公司及其权属公司招聘工作人员6人考试参考试题及答案解析
- 2025山西阳泉人才发展集团招聘服务工作人员19人备考考试题库附答案解析
- 2025年金华兰溪市市属国企(兰创集团)下半年公开招聘工作人员19人备考考试题库附答案解析
- 2025广东肇庆市高要区公办中小学招聘临聘教师200人备考考试题库附答案解析
- 哲学博士答辩精要
- 2025版泌尿外科疾病常见症状及护理建议分享
- 运动中的数学乐园
- 工厂安全培训效果验证课件
- 神经影像标志物筛选-洞察及研究
- 华为信息安全管理培训课件
- 诗经整本书阅读课件
- (2025年标准)预售小麦协议书
- 2025年院感测试题及答案
- 承包商全流程安全培训
- 全套教学课件《工程伦理学》
- 2021新苏教版科学五年级上册第二单元《热传递》课件
- 专升本高等数学的讲义80页PPT课件
- 汽车机械基础(全套课件)
- 道路凿除及新做砼路面施工方案
- ISO50001-2018能源管理体系内审计划、记录及报告
评论
0/150
提交评论