hibernate官方文档阅读笔记

本文详细介绍了Hibernate持久化类、映射文件、配置、持久化类、对象/关系数据库映射基础等内容,涵盖了从入门到进阶的全面知识。从如何创建持久化类、配置映射文件到优化性能,提供了丰富的实践经验和技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

第1章 教程
1、所有的持久化类(persistent classes)都要求有无参的构造器,因为Hibernate必须使用Java反射机制来为你创建对象。构造器的访问级别可以使
   private,然而当生成运行时代理(runtime proxy)的时候则要求使用至少是package级别的访问控制,这样在没有字节码指令的情况下,从持久化类里
   获取数据会更有效率。
2、映射文件告诉Hibernate它应该访问数据库里面的哪个表及应该使用表里面的哪些字段。
3、嵌套的generator元素指定标识符的生成策略(也就是标识符值是怎么产生的)。
4、默认情况下,类里面的属性都被视为非持久化的。
5、当没有设定column attribute的时候,Hibernate缺省地使用JavaBean的属性名作为字段名。
6、如果在映射文件中没有设置type属性的话,Hibernate会自己试着去确定正确的转换类型和它的映射类型。
7、Hibernate支持两个第三方的开源JDBC连接池:c3p0和proxool。
8、Hibernate的SessionFactory是一个关联于特定数据库全局的工厂。如果你要使用多个数据库,就要用多个的<session-factory>,通常把它们放在多个
   配置文件中(为了更容易启动)。
9、org.hibernate.SessionFactory是一个线程安全的全局对象,只需要被实例化一次。
10、所有的双向关联需要有一端被设置为inverse。在一对多关联中它必须是代表多(many)的那端。而在多对多(many-to-many)关联中,你可以任意选
    取一端。


第2章 体系结构
1、hibernate体系结构
    
2、从3.1开始,SessionFactory.getCurrentSession()的后台实现是可拔插的。


第3章 配置
1、org.hibernate.cfg.Configuration实例代表了一个应用程序中Java类型到SQL数据库映射的完整集合。org.hibernate.cfg.Configuration被用来构建一
   个(不可变的)org.hibernate.SessionFactory。
2、org.hibernate.cfg.Configuration实例被设计成启动期间对象,一旦SessionFactory创建完成它就被丢弃了。
3、当所有映射定义被org.hibernate.cfg.Configuration解析后,应用程序必须获得一个用于构建org.hibernate.Session实例的工厂。这个工厂将被应用
   程序的所有线程共享。
4、Hibernate允许应用程序创建多个org.hibernate.SessionFactory实例。
5、Hibernate自带的连接池算法相当不成熟。它只是为了让你快些上手,并不适合用于产品系统或性能测试中。出于最佳性能和稳定性考虑你应该使用第三  
   方的连接池。这将关闭Hibernate自带的连接池。
6、C3PO是一个随Hibernate一同分发的开源的JDBC连接池。
7、任何连接(connection)属性的名都要以“hibernate.connection”开头。
8、如果你希望使用二进制或可序列化类型的大对象,你应该开启hibernate.jdbc.use_streams_for_binary属性。
9、hibernate.cfg.xml文件可以当成hibernate.properties的替代。若两个文件同时存在,它将覆盖前者的属性。


第4章 持久化类


第5章 对象/关系数据库映射基础
1、所有的生成器都实现org.hibernate.id.IdentifierGenerator接口。
2、UUID包含:IP地址、JVM的启动时间(精确到1/4秒)、系统时间和计数器值(在JVM中唯一)。
3、所有的Hibernate内建类型,除了collections以外,都支持空(null)语义。
4、实体及其集合的唯一标识可以使除了binary、blob和clob之外的任何基础类型。(联合标识也是允许的)
5、如果对象有任何属性由数据库生成值,Hibernate应用程序需要进行刷新。
6、对定义了generated properties的实体,每当Hibernate执行一条SQL INSERT或者UPDATE语句,会立刻执行一条select来获得生成的值。被标明为
   generated的属性还必须是non-insertable和non-updaeable的。只有versions、timestamps和simple properties可以被标明为generated。


第6章 类型


第7章 集合映射
1、两个实体不能共享同一个集合类实例的引用。集合值属性无法支持空值语义;Hibernate对空的集合引用和空集合不加区别。
2、Hibernate要求持久化集合值字段必须声明为接口。


第8章 关联关系映射
1、基于外键关联的单向一对一关联和单向多对一关联几乎是一样的。唯一的不同就是单向一对一关联中的外键字段具有唯一性约束。
2、基于主键关联的单向一对一关联通常使用一个特定的id生成器。


第9章 组件映射
1、组合元素可以包含组件,但是不能包含集合。如果你的组合元素自身包含组件,你必须使用<nested-composite-element>标签。
2、<composite-map-key>元素允许你映射一个组件类作为一个Map的key,前提是你必须正确的在这个类中重写了hashCode()和equals()方法。
3、可以使用一个组件作为一个实体类的标识符。你的组件类必须满足以下要求:
   1)必须实行java.io.Serializable接口。
   2)必须重新实现equals()和hashCode()方法,始终和组件关键字在数据库中的概念保持一致。
4、不能使用一个IdentifierGenerator产生组合关键字。


第10章 继承映射


第11章 与对象共事
1、Hibernate定义并支持下列对象状态:
   1)瞬时:由new操作符创建,且尚未与Session关联的对象。
      注意:如果瞬时对象在程序中没有被引用,它会被垃圾回收器销毁。
   2)持久:持久的实例在数据库中有对应的记录,并拥有一个持久化标识。它存在于相关联的Session作用范围内。
   3)脱管:与持久对象关联的Session被关闭后,对象就变为脱管的。
2、如果你知道的查询只会返回一个对象,可使用list()的快捷方式uniqueResult()。
3、Hibernate查询有时返回元组(元组指一条结果行包含多个对象),每个元组以数组的形式返回。
4、每间隔一段时间,Session会执行一些必要的SQL语句来把内存中的对象的状态同步到JDBC连接中,这个过程被称为刷(flush)出。默认会在下面的时间
   点执行:
   1)在某些查询执行之前
   2)在调用org.hibernate.Transaction.commit()的时候
   3)在调用Session.flush()的时候
5、如果对象使用native方式来生成ID(持久化标识)的话,它们一执行save就会被插入。


第12章 只读实体


第13章 事务和并发
1、SessionFactory是线程安全的对象,它为所有的应用程序线程所共享。
2、Session是非线程安全的。


第14章 拦截器与事件
1、拦截器允许应用程序在持久化对象被保存、更新、删除或是加载之前,检查并(或)修改其属性。
2、拦截器可以有两种:Session范围内的和SessionFactory范围内的。
   1)当使用某个重载的SessionFactory.openSession()使用Interceptor作为参数调用打开一个session的时候,就指定了Session范围内的拦截器。
   2)SessionFactory范围内的拦截器要通过Configuration中注册,而这必须在创建SessionFactory之前。


第15章 批量处理
1、Hibernate把所有新插入的实例在session级别的缓存区进行了缓存,commit后,缓存清空。
2、无状态session不实现第一级cache,也不和第二级缓存,或者查询缓存交互。
3、HQL中的DML(数据操纵语言)
   UPDATE和DELETE语句的伪语法为:(UPDATE | DELETE)FROM? EntityName (WHERE where_conditions)?
   INSERT语句的伪码是:INSERT INTO EntityName properties_list select_statement
   注意:只支持INSERT INTO ... SELECT ... 形式,不支持INSERT INTO ... VALUES ... 形式。
4、HQL UPDATE语句,默认不会影响更新实体的version或the timestamp属性值。但是,通过使用versioned update,你可以强制Hibernate正确的重置
   version或者timestamp属性值。这通过在UPDATE关键字后面增加VERSIONED关键字来实现的。
   注意:自定义的版本类型(org.hibernate.usertype.UserVersionType)不允许和update versioned语句联用。


第16章 HQL:Hibernate查询语言
1、除了Java类与属性的名称外,查询语句对大小写并不敏感。
2、通常我们不需要使用类的全限定名,因为auto-import(自动引入)是缺省的情况。
3、如果指派了别名,需要使用完整的属性名。
4、处理时间的函数
   1)系统时间
      1.1)current_date()
      1.2)current_time()
      1.3)current_timestamp()
   2)时间处理
      2.1)second()
      2.2)minute()
      2.3)hour()
      2.4)day()
      2.5)month()
      2.6)year()
5、一个子查询必须被圆括号包围起来。


第17章 条件查询
1、org.hibernate.Criteria接口表示特定持久类的一个查询。Session是Criteria实例的工厂。


第18章 Native SQL查询
1、对原生SQL查询执行的控制是通过SQLQuery接口进行的,通过执行Session.createSQLQuery()获取这个接口。
2、原生SQL查询假若其查询结果实体是继承树中的一部分,它必须包含基类和所有子类的所有属性。
3、对存储过程进行的查询无法使用setFirstResult()/setMaxResult()进行分页。


第19章 过滤数据
1、Session中默认是不启用过滤器的,必须通过Session.enabledFilter()方法显示的启用。


第20章 映射
1、Hibernate可以用XML数据来进行工作,恰如用持久化的POJO进行工作那样。解析过的XML树可以被认为是替代POJO的另外一种在对象层面上表示关系型数
   据的途径。


第21章 提升性能
1、在Session范围之外访问未初始化的集合或代理,Hibernate将会抛出LazyInitializationException异常。
2、Hibernate在缺省情况下将禁用缓存。
3、Hibernate默认是不进行查询缓存的。如若需要进行缓存,请调用org.hibernate.Query.setCacheable(true)方法。


第22章 工具箱指南


第23章 Additional modules


第24章 示例:父子关系


第25章 示例:Weblog应用程序


第26章 示例:复杂映射实例

















评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值