O/R Mapping:
对象-关系映射,实现了Java应用中的对象到关系数据数据库中的表的自动的(和透明的)持久化,使用元数据(meta data)描述对象与数据库间的映射
Hibernate是一种开放源代码的对象/关系映射持久层框架
事务处理,生命周期管理不依赖于J2EE容器
解决数据库的方言问题
Hibernate只需要操作对象就可以完成数据库的增删查改操作,使用hibernate更面向对象
轻量级,无侵入性,移植性好
不适用范围:
批量对对象进行操作
数据库特定映射
表间关系复杂,会造成性能问题
轻量级和重量级:
一个框架的轻与重,主要是指该框架对于其他框架或容器的依赖性。如果依赖性强,那么是重量级框架,如果没有依赖性就是轻量级框架
Configuration类负责管理Hibernate的配置信息,包括:
Hibernate运行的底层信息:数据库的URL,用户名,密码
JDBC驱动类等
Configuration cfg = new Configuration().configure() 与Configuration cfg = new Configuration();
主键生成策略:
Increment(自动增长,其主键由Hibernate控制,数据库中相应的字段没有设置自动增长,不能用于集群)
Identity(自动增长,对DB2,Mysql,sql server数据库中对应的字段设置自动增长)
Sequence(对Oracle数据库中相应的字段设置自动增长)
UUID采用UUID算法生成字符串唯一标识,UUID生成策略相对来讲速度较快,不需要使用数据库相关的维护表的操作,但是查找相对较慢
Native(根据数据库底层的描述,决定采用identity,sequence中的一个)
Assigned手动分配主键,当generator没有设置时,采用这种方式
select使用触发器分配主键
foreign使用另外一个相关联的对象的标识符,通常和<one-to-one>联合起来使用
对象状态:
Transient(瞬时状态):数据库没有相应记录,没有session管理
Persistent(持久状态):session调用save/update,并在数据库中添加了相应记录,并且session正在进行管理
Detached(游离状态):当session事务提交时,数据库有与之对应的记录,从session一级缓存清除,session不再对其管理.
Hibernate可以使用原生SQL语句做查询
SQLQuery是一个接口
SQLQuery q = Session.createSQLQuery(“sql语句”);
List list =q.list();
For(Object obj : list){
Object[] arr = (Object[])obj;
System.out.println(arr[0] + “ ” +arr[1]);
}
一般用于复杂查询和统计查询
org.hibernate.LazyInitializationException为hibernate的延迟加载异常。在查询延迟加载对象时,并不会立即发出sql语句做查询,而是在该对象被使用时才发出sql语句查询,如果在使用延迟加载对象时,session做了关闭,就会抛出该异常
Session的load()和get()的区别:
1.Get()为立即加载,在执行了get()方法后,立即发出sql语句查询对象
Load()为延迟加载,在执行了load()方法后,并不会立即发出sql语句查询对象,而是在使用该对象时,才会发出sql语句
2.如果查询主键不存在的对象时,get()返回null,load()抛出对象未找到异常
对应关系:
一对一:
一条主表记录对应一条从表记录,同时一条从表记录对应一条主表记录
一对一关联方式有两种:
1.主键关联:从表没有专门的外键列,从表主键同时又是主表的外键
2.外键关联:从表有专门的外键列,关联主表,但外键列的值不重复,是多对一的特例
一般做一对一时,采用唯一外键关联,外键列可以设置为null
一对多:一条主表记录对应多条从表记录,一条从表记录只对应一条主表记录,外键列在从表身上
多对多:一条主表记录对应多条从表记录,一条从表记录对应多条主表记录,需要中间表来关联
CasCade和inverse的区别:
casCade表示级联操作,当主表记录做添加,删除,修改时,从表记录是否做相应的操作,维护的是记录。
inverse表示控制反转,当该属性为真时,表示由对方维护外键,当前对象不做维护,维护的是外键。一般将一方设置为inverse=“true”,由多方来维护外键
Hibernate注解配置:
定义实体类:
@Entity---定义实体类,表示该类可以通过注解进行操作
@Table(name=””)---指明该实体类映射的数据库表名
@Id---表示定义主键
@GeneratedValue(strategy=GenerationType.AUTO)--定义主键生成策略,为数据库自动增长
@Column(name=””)---定义该属性对应的列名,如果属性名和列名一致可以不用写
@Transient表示该属性并非一个到数据库表的字段的映射