ImageVerifierCode 换一换
格式:DOCX , 页数:13 ,大小:717.41KB ,
资源ID:5979577      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/5979577.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(Hibernate in Action学习笔记.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

Hibernate in Action学习笔记.docx

1、Hibernate in Action学习笔记Hibernate in Action学习笔记2015年3月1日目录Q1. 面向对象应用程序中的持久化问题 11.1范式不匹配 11.2粒度问题 11.3子类型问题 11.4同一性问题 11.5与关联相关的问题 11.6数据访问方式的问题 1Q2. 如何解决这些持久化问题 22.1为什么不使用分层架构,用DAO层解决。 22.2为什么不使用Java序列化 22.3为什么不使用面向对象数据库系统 22.4为什么不用XML持久化 22.5使用ORM 2Q3. 什么是ORM,包括哪些内容? 3Q4. ORM质量等级 3Q5. 一般的ORM 问题 3Q6.

2、 Hibernate 自由的开发过程 4Q7. Hello Hibernate 4Q1. 面向对象应用程序中的持久化问题1.1 范式不匹配在电子商务系统中,用户与账单的关系为一对多关系。 面向对象时设计为一个用户类与一个账单类。可以为用户类添加集合属性(集合中存储账单),也可以为账单类添加用户属性。但数据库表只能通过账单的外键来实现。 假如用户信息中含有地址(国家、地区、省)等。面向对象时一般会封装为一个街道类,在用户类中持有街道类的属性解决。而数据库表中则不需要存在一个地址表。1.2 粒度问题这里粒度是指正在使用的类型的相对大小。面向对象允许我们无限的扩展类型,而SQL标准支持用户定义的数据

3、类型却少的可怜。面向对象允许对象的嵌套组合,而数据库表只有两种粒度:表和列。1.3 子类型问题由于继承带来的问题。1.4 同一性问题Java中同一性通过 a = b 和 equals()检查,数据库通过外键检查。这样通常需要一个业务无关的代理键(UUID)来解决。同一性对系统如何处理高速缓存和事务密切相关。1.5 与关联相关的问题面向对象利用对象引用表示关联;但是在关系数据库中使用外键。对象引用由固有的方向性,而外键没有(可以通过表的联结和投影创建任意关联)1.6 数据访问方式的问题Java中可以使用aUser.getDetails().getAccountNumber()。而数据库必须考虑性

4、能,而进行连结查询。也就是在你遍历对象网络之前要构建有效的连结查询!另一方面:懒加载机制总是期望在使用时在获得对象。但会产生N+1问题:如默认情况下,当Hibernate从数据库中加载Customer对象时,会同时加载所有关联的 Order对象。以Customer和Order类为例,假定ORDERS表的CUSTOMER_ID外键允许为null以下Session的find()方法用于到数据库中检索所有的Customer对象:List customerLists=session.find(from Customer as c);运行以上find()方法时,Hibernate将先查询CUSTOMER

5、S表中所有的记录,然后根据每条记录的ID,到ORDERS表中查询有参照关系的记录,Hibernate将依次执行以下select语句:select * from CUSTOMERS;select * from ORDERS where CUSTOMER_ID=1;select * from ORDERS where CUSTOMER_ID=2;select * from ORDERS where CUSTOMER_ID=3;select * from ORDERS where CUSTOMER_ID=4;Q2. 如何解决这些持久化问题2.1 为什么不使用分层架构,用DAO层解决。DAO是个好模式

6、,甚至经常推荐与ORM一起使用,然而,给每个领域模型类编写持久化代码的工作量非常大,特别当支持多个SQL方言的时候。为什么不实现个简单映射框架呢?因为有Hibernate。(80000行代码,25000行测试代码)。2.2 为什么不使用Java序列化序列化之后的关联对象网络只能被当做一个整体访问:没有反序列化整个流,就不可能从流中获取任何数据。(在依赖序列化的网络传输中,要考虑此问题)2.3 为什么不使用面向对象数据库系统面向对象数据库系统没有流行起来。2.4 为什么不用XML持久化XML是序列化得一个变体,同时你可能遭受对象/层次结构不匹配的危险。2.5 使用ORM提高生产力提高可维护性性能

7、损耗供应商独立性实现JPA标准Q3. 什么是ORM,包括哪些内容?ORM就是利用描述对象和数据库之间映射的元数据,自动(且透明)的把Java应用程序中的对象持久化到关系数据库中的表。本质是:把数据从一种表示法(可逆)转换为另一种表示法进行工作。ORM解决方案包含下面的4个部分: 在持久化类的对象上执行基本的CRUD操作的一个API ; 用于指定引用类或者类属性的查询的一种语言或者API 用于指定映射元数据的一种工具: 用于实现ORM的一项技术,与事务对象交互,执行脏检查( dirty checking ) 、延迟关联抓以及其他优化功能。Q4. ORM质量等级纯关系整个应闸程序(包括用户界面)都

8、围绕着关系模型和基于SQL的关系操作而设计轻量对象映射实体被表示为手工映射到关系表的类。使用众所周知的设计模式,把手工编码的SQL/JDBC从业务逻辑中隐藏起来。中等对象映射这种应用程序围绕对象模型而设计。SQL使用一个代码生成的工具在创建时产生,或者通过框架代码在运行时产生。完全对象映射完全的对象映射支持完善的对象模型: 组合、继承、多态和可达的持久化。Q5. 一般的ORM 问题 持久化类看起来什么样?持久化工具有多透明? 映射元数据如何定义? 对象同一性和等同性如何与数据库(主键同一柱相关? 应该如何映射类继承层次结构? 持久化逻辑如何在运行时与业务领域的对象文互? 什么是持久化对象的生命

9、周期? 提供什么工具用来排序、搜索和统计? 如何利用关联有效地获取数据?Q6. Hibernate EJB3和JPA6.1 理解标准新的EJB 3.0规范有儿个部分给会话 bean 消息驱动 bean 以及部署规则等,定义新的EJB编程模型,规范的第二部分专门处理持久化实体、ORM 元数据、持久化管理器接口和查询语言部分被称作JPA。新标准中设计了两条重要的原则: 1、JPA引擎应该是可插拔的。2、JPA引擎应该能够在EJB3.0(或者任何其他)运行时环境之外运行。Hibernate实现了Java Persistence。6.1.1 HibernateCore它是持久化的基础服务,带有原生的A

10、PI和它存储XML文件中的映射元数据。它有种查询语称作HQL (与 SQL 几乎相同),以及用Criteria Example查询的可编硬查询接口。6.1.2 Hibernate AnnotationsJPA规范定义ORM元数据语法和语义,主要机制为 JDK 5.0注解Hibernate annotations般来说是实现JPA标准的组基础注解,它们也是更高级的和更奇异的Hibern ate 映射和调优所需的组扩展注解。6.1.3 Hibernate EntityManagerJPA范也定义编程接口、持久化对象的生命周期规则和查询特。JPA这部分的Hibemat实现可被用作 Hibernate

11、 EntyManage。Hibernate EntityManger是对提供JPA就容性的HibemateCore个小包装。Q7. Hibernate 自由的开发过程我们先从总体上看看可用的工共、用作源输入的制品,以及生成的输出。图2-1展现了Ant的各种导入和导出任务,所有功能对Eclipse的Hibemate Tools插件都可用.阅读本意时请参照这Q8. Hello Hibernate/First unit of workSession session = HibernateUtil.getSessionFactory().openSession();Transaction tx = s

12、ession.beginTransaction();Foo foo = new Foo();Long fooId = (Long)session.save(foo);mit();session.close();/second unit of workSession newSession = HibernateUtil.getSessionFactory().openSession();Transaction newTransaction = session.beginTransaction();Listfoos = newSession.createQuery(“from Foo”).list

13、();newTmit();newSession.close();/third unit of workSession thirdSession = HibernateUtil.getSessionFactory().openSession();Transaction thirdTransaction = session.beginTransaction();FoofoothirdSession.get(Foo.class,fooid);foo.setOneProperty(“some value”)thirdTmit();/脏检查自动执行更新thirdSession.close();Hiber

14、nateUtil.shutdown();调用Hibernate Session、Transaction和Query接口访问数据库:Session (会话)Hibernate Session集多种功能于一身。它是个单线程、非共享的对象,表示使用数据库的一个特定工作单元。它有持久化管理器API,调用它来加载和存储对象。(Session的内部由一列SQL语句组成,这些话句要与数据库在某个时点上进行同步,且托管持久化实例的一个映像由Session监控.)Transaction (事务)这个Hibernate API可以用来编程式地设置事务范围,但它是可选的(事务范围不是可选的)。其他的选择还有JDBC

15、事务划分、JTA接口,或者带有EJB的容器托管事务。Query (查询)数据库查询可以写进Hibernate自己的面向对象的查询语言( HQL ) 或者简单的SQL中。这个接口允许你创建查询、在查询中绑定参数给占优符,并以各种方式执行查询。Q9. Hibernate配置SessionFactory通过Configuration类提供配置信息。Configuration默认(可通过Configuration的构造方法改变)读取在ClassPath根目录下搜索hibernate.properties所有的Hibernate配置可以再org.hibernate.cfg.Environment中找到。

16、Q10. 数据库连接池连接地在非托管的应用程序运行时环境中的角色(即不要任何应用程序服务器)。使用Hibernate,这个图就变了: 它充当JDBC连接池的一个客户端程序,如图2-3所示。应用程序代码给持久化操作使用Hibemate的Session和Query API ,它(可能)用Hibernate的Transaction API管理数据库事务。Q11. 监控HibernateStatistics stats =HibernateUtil .getSessionFactory().getStatistics();stats.setStatisticsEnabled (true) ;stats

17、.getSessionOpenCount ( ) ;stats.logSummary();EntityStatisticsitemStats =stats .getEntityStatistics(.auction .model.Item.) ;itemStats .getFetchCount();统计接口中,Statistics用于全局的信息,EntityStatistics用于有关一个特定实体的信息,CollectionStatistics用于一俨将定的集合任务,QueryStatistics用于SQL和HQL查询,SecondLevelCacheStatistics用于详细的关于可选的二

18、级数据高速缓存中的一个特定区域的运行时信息。一种方便的方法是logSummary () ,它通过单个调用把一个完整的摘要打印到控制台.如果想要通过配置来启用统计绵合,并且不用编程,就设置hibernate.generate_statistics配置属性为true。有关各种统计税取方法的更多信息请见API文挡。Q12. JPA Hello World12.1 使用注解标注使用javax.persistence.*中的注解Entity Table Id GeneratedValue Column ManyToOne注解标注实体。12.2 构键Persistence unitSessionFacto

19、ry在hibernate应用程序中表示一个特定的逻辑数据存储配置. EntityManagerFactory JPA应用程序中扮演着同样的角色,你用配置文件或者在应用程序代码中配置EtityManager Factory (EMF),就像配置SessionFactory一样。EMF的配置,与一组映射元数据(通常是被注解的类)一起,被称作持久化单元(persistence unit).编写persistence.xml提供必要的配置参数,并放入到META-INF目录下。persistence.xml包括指定JPA的实现产品(hibernate),以及hibernate的各种属性。12.3 使用J

20、PA编程接口 javax.persistence.Persistence给Entity ManagerFactory的创建提供一种静态方法的一个启动类。 javax.persistence.EntityManagerFactory等同于HibemateSessionFactory这个运行时对象代表个特定的持久化单元它是钱安全的,通常被当作sngleton) 处理,并给EntityManage实例的创建提供方法。 javax.persistence.EntityManager等同于Hibernate Session。这个单线程、非共享的对象表示数据访问的个特定工作单元。它提供方法去管理实例的命周

21、期创建Query实例 javax.persistence.Query等同于HibemateQuery个对象是一种特定的 JPA语言或者原生的SQL查询表示法,它允许参数安全绑定,并给查询的执行提供各种各样的方法。 javax.persistence.EntityTransaction等同于Hibernate Transaction,在JavaSE环境中用于RESOURCE_LOCAL事务的划分。在Java EE中,依赖JPA标准的javax.transaction.UserTransaction接口进行编程式的事务划分。/ Start EntityManagerFactoryEntityMan

22、agerFactoryemf =Persistence.createEntityManagerFactory(helloworld);/ First unit of workEntityManagerem = emf.createEntityManager();EntityTransactiontx = em.getTransaction();tx.begin();Message message = new Message(Hello World);em.persist(message);mit();em.close();/ Second unit of workEntityManagerne

23、wEm = emf.createEntityManager();EntityTransactionnewTx = newEm.getTransaction();newTx.begin();List messages = newEm.createQuery(select m from Message m order by m.textasc).getResultList();System.out.println(messages.size() + message(s) found );for (Object m : messages) Message loadedMsg = (Message)

24、m;System.out.println(loadedMsg.getText();newTmit();newEm.close();/ Shutting down the applicationemf.close();Q13. 与Java EE整合Hibemate能够与JavaEE容器整合的三大关注点在:JTA、JNDI、JMX。JTA允许Hi bernate参与托管资源(数据库连接)中的事务。并且能够把自身当作一项服务绑定到JNDI上。最后,Hibernate可以通过JMX被部署,然后通过JMX容器被当作服务来管理,并且使用标准的JMX户端程序在运行时被监控。13.1 与JTA整合JTA是Ja

25、va企业应用中事务控制的标准服务接口。包括于事务划分的UserTransaction API和用于参与事务生命周期中的TransactionManager API。事务管理然能够协调跨资源的单个事务一。JTA 事务服务由所有Java EE应用程序服务器提供。需要在配置sessionFactory的hibernate.transaction.factory_class属性为JTATransactionFactory。13.2 JNDI绑定的SessionFactorySessionFactory应该如何储,以及它在应用程序代码中应该如何访问?一般的做法是编写一个在静态字段中存放SessionFa

26、ctory的HibernateUtil类,并提供静态的getSessionFactory()方法。然而,如果在个支持JNDI的部署应用程序,Hibrnate可以把SessionFactory绑定到JNDI.你需要时可以到那里查找。hibernage.session_factory_narne属性设且为JNDI节点节点的名称,Hibemate的Se ssionFactory就会自动把自身绑定到 JNDI。13.3 JMX服务部署Java管理扩展(Java Management Extension. JMX).JMX是关子系统组件管理或者系统服务管理的。Hibernage可以作为一项托管的JMX服

27、务,被其他的服务依赖和使用。Q14. Hiberante Core与JPA对照表第三章领域模型和持久化Q15. 领域模型15.1 分析领域模型按照面向对象的方式考虑:抽象、封装、多态、继承按照数据库模式考虑:主、子表,约束等。两者有较大差别。例如:报销单报销明细。15.2 实现领域模型领域模型分析结束后,还必须处理几个经典问题:如何把业务关注点与横切点(例如事务和持久化)分离?你需要自动的还是透明的持久化?必须使用特定的编程模型来实现这点吗?15.2.1 横切关注分离1、 EJB个托管的组件EJB容器内部执行容器拦截别bean的调用并执行它自己的功能。这种方法允许容器以一种普遍方式实现预设的横

28、切关注点安全性、并发性、持久化、事务和远程。2、 使用Spring的AOP事务管理机制来处理以上问题。15.2.2 透明和自动持久化透明词,意味着领域模型的持久化类和持久化逻辑之间一个完整的关注点分离,在这里持久化类不知道且不依赖于持久化机制。自动一词是指让你不用处理低级机械化细节的一种持久化解决方案。体现在:Hibernate的实体使用POJO;Hibernate使用很少的持久化接口Session、Query.15.2.3 编写POJO并制定元数据15.3 创建动态的应用程序除最基本的POJO来表示实体外,Hibernate还允许通过Map和Dom4j来表示实体。第四章映射持久化类Q16.

29、理解实体和值类型16.1 细粒度的领域模型Hibernate主要目标是支持细粒度的领域模型,粗略地说,细粒度意味着类比表更多。例如:用户可能既有付款地址又有家庭住址。16.2 识别实体和值类型考虑如下因素识别值对象:1、是否有一个依赖的生命周期,如果此对象依赖于另一个对象的生灭,就认为他是有一个依赖的生命周期的两个对象是聚合关系。2、是否需要它们自己的同一性(java中体现为 = 和 equals() 方法,数据库中体现为主键是否相等),就是说你的代码中会不会去比较两个对象是否具有同一性,3、是否需要支持共享引用。如果一个对象有一个依赖的生命周期,不需要它们自己的同一性,并且不必支持共享引用的

30、话它就是个值类型的对象。16.3 映射带有同一性的实体16.3.1 理解 Java 同一性和等同性 如果对象在JVM占据着相同的内存位置,它们就是同一的。这可以通过使用=操作符进行检查。这个概念称作对象同一性。 如果对象有着相同的值它们就是相等的,如equals (object o)方法定义的。这个概念叫做等同性。 如果存储在一个关系数据库中的对象表示相同的行,或者它们共享相同的表和主键值它们就是同一的。这个概念称作数据库同一性。16.3.2 处理数据库同一性给实体添加标识符属性,并映射标识符属性。16.4 类映射选项16.4.1 动态的 SQL 生成通过制定dynamicInsert及dynamicUpdate可以制定是否动态生成插入及更语句。16.4.2 使实体不可变一个特定类的实例可以是不可变的,例如数据字典。通过将mutable属性设为false来映射个不可变的类,就可以避免脏检。16.4.3 HQL中实体名称默认情况下,所有的类都自动的“导入”到Hibernate查询语言(HQL)的命名空间,这意味着,你何以在HQL中使用更为简短的名称。但如果有两个类具有同样的类名则会引起冲突。解决方法一:可通过autoimport=”false”属性,禁止自动导入,通过在xml中指定rename来手动导入如下:或通过Entity(name=Auctionltem)来指定别名。解

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1