4, hibernate基础
4.1 hibernate基础语义
Configuration
Configuration config = new Configuration().configure();
File file = new File("c:\\sample\\myhibernate.xml");
Configuration config = new Configuration().configure(file);
SessionFactory
Configuration config = new Configuration().configure();
SessionFactory sessionFactory = config.buildSessionFactory();
采用线程安全的设计,可由多个线程并发调用,大多情况下,一个应用中针对一个数据库
共享一个sessionFactory实例即可。
Session
非线程安全,一个session实例同时可有一个线程实用。
Session session = sessionFactory.openSession();
save,get,delete,find(hibernate2),hibernate3-->Query,Criteria
4.2 基础配置
SessionFactory配置
数据库连接配置
数据库连接池的配置
默认数据库连接池
hibernate.connection.pool_size 2
c3p0
dbcp
proxool
事务管理
使用jdbc的事务处理机制
hibernate.transaction.factory_class
net.sf.hibernate.transaction.JDBCTransactionFactory
实用JTA
hibernate.transaction.factory_class
net.sf.hibernate.transaction.JTATransactionFactory
jta.UserTransaction jta/usertransaction
可选配置项
4.3 hibernate O/R映射
基本数据类型
实体映射
实体映射基础
表名--类名映射
主键映射
字段映射
高级映射技术
自定义数据类型
UserType
CompositeUserType
复合主键
基于实体类属性的复合主键
blob,clob字段的映射
实体映射策略
4.4 数据关联
一对一
主键关联
1,一对一节点映射 , 级联关系
2,foreign主键生成,一对一映射节点,约束
唯一外键关联
1,many-to-one,unique
2,one-to-one
一对多
单向一对多,双向一对多
多对多
4.5 hibernate数据检索
Criteria Query
复合查询:
Criteria criteria = session.createCriteria(TUser.class);
Criteria addrCriteria = criteria.createCriteria("address");
addrCriteria.add(Expression.like("address","%ShangHai%"));
DetachedCriteria
脱离session。
DetachedCriteria deCriteria = DetachedCriteria.forClass(TUser.class);
deCriteria.add(Expression.eq("name","...."));
DetachedCriteria criteria = deCriteria.getExecutableCriteria(session);
可用于子查询Subqueries.propertyGt("age",avgAge);
Criteria高级特性:
1,限定返回的记录范围
Criteria criteria = session.createCriteria(TUser.class);
criteria.setFirstResult(100);
criteria.setMaxResults(20);
2,分组与统计
criteria.setProjection(Projections.groupProperty("age"));
Hibernate Query Language
4.6 HQL实用技术
实体查询
属性查询
实体更新与删除
分组与排序
参数绑定
引用查询
将sql保存在配置文件中,需要调用的时候进行读取。
Query query = session.getNamedQuery("queryByName");
联合查询
子查询
数据加载方式
sql查询
4.7 自定义持久化实现
<sql-insert>
5. hibernate高级特性
5.1 hibernate持久化实现
实体对象生命周期
实体对象识别
数据缓存
hibernate数据缓存
内部缓存又称一级缓存
由hibernate自身维护的。如果需要手动干预:
session.evict
session.clear
二级缓存
可纳入缓存管理中的条件:
1,数据不会被第三方应用修改
2,数据大小在可接受的范围之内
3,数据更新率较低
4,同一数据可能会被系统频繁使用
5,非关键数据
事务管理
基于jdbc事务管理
基于jta事务管理
jta提供了跨session的事务管理能力,管理多个session的事务
悲观锁(....for update 依靠数据库的锁机制实现)
Criteria.setLockMode
Query.setLockMode
Session.lock
乐观锁(鉴于悲观锁对数据库性能的大量开销,特别是长事务而言。)
version----比较版本号,提交版本>当前版本,才予以提交。
持久层操作
数据加载
session.get/load
session.find/iterate(2)//session.createQuery().list()/session.createQuery().iterate()(3)
iterate会先找出id,然后从中找相符的记录。n+1条sql。但它会先去缓存(find出的记录)中读取,
这时候也许就是很少的select语句了。
海量数据的操作:
while(it.hasNext()){
TUser user = (TUser)it.next();
session.evict(user);
sessionFactory.evict(TUser.class,user.getId());
}
Query Cache
保存了之前查询操作执行过的select SQL,以及由此查询产生 的查询结果集。
如果数据表发生了变化,会自动将Query Cache中对应表的sql缓存废除。
只在特定的情况下产生:
1,完全相同的select sql重复执行
2,在两次查询之间,此select sql对应的库表没有发生过变化。
如果要应用它,在配置文件中配置:
<session-facotry>
<property name = "hibernate.cache.use_query_cache">true</property>
</session-factory>
之后我们在查询执行之前,query.setCacheable(true);
延迟加载
实体对象的延迟加载
hibernate中引入了CGLib作为代理机制实现的基础,其基本实现原理就是通过
有CGLib构造一个包含目标对象所有属性和方法的动态对象。通过一个中间代理
实现了数据延迟加载功能,只有当客户程序真正调用实体类的取值方法时,hibernate
才会执行数据库查询操作。
集合类型的延迟加载
Collection addSet = user.getAddresses(); 1
Iterator it = addSet.iterator(); 2
代码运行至2,真正的数据读取操作才开始执行。
hibernate 对集合类型的缓存时,首先是这个集合中所有实体的id列表(数据所有)
然后是各个实体对象。
<cache usage="read-only/read-write">
read-only(数据索引,不会将集合中的实体元素同时纳入缓存)
read-write(实体元素也纳入缓存)
属性延迟加载
配置,hibernate3中还需借助类增强器对二进制class文件进行强化处理。
数据保存
session.save 会去内部缓存中查找。
session.update detached---->persistent
session.saveOrUpdate
数据批量操作
数据批量导入
<property name = "hibernate.jdbc.batch_size">25</property>
数据批量删除
找出符合的id,再循环根据id删除,为了记录状态,删除了那些记录才这样做的。
这样导致了几个问题:
1)内存消耗,因为首先必须将所有符合条件的数据加载到内存中。
游标的hibernate批量删除:
Query query = session.createQuery(hql);
ScrollableResults scRes = query.scroll();
while(scRes.next()){....}
2)迭代删除操作的执行效率
调整hibernate.jdbc.batch_size参数解决
无法保证缓存数据的一致有效性。
Collection类型
Set 如果做删除操作,会删去符合条件的所有记录,但是我们只想删除特定的记录,那么bag
Bag 无序可重复(set,list) 先全部删除,然后插入。
idbag----collection-id
Map
List
5.2 hibernate回调与拦截机制
Interceptor 定义了hibernate中的通用拦截机制。session创建时即可以指定加载
相应的interceptor,之后此session的持久化操作动作都将首先经由拦截器捕获处理。
SessionFactory sessionFactory = config.buildSessionFactory();
Interceptor it = new MyInterceptor();
session = sessionFactory.openSession(it);
5.3 hibernate 使用技术
hibernate分页
setFirstResut setFetchSize
dialect:指定了所有底层数据库的对外统一接口。
实现getLimitString方法。
Session管理
ThreadLocal
Hibernate与Spring Framework
hibernate 常见优化策略
1,最新的hibernate版本
2,制定合理的缓存策略
3,采用合理的session管理机制 ThreadLocal
4,尽量使用延迟加载特性
5,设定合理的批处理参数(batch_size)
6,如果可能,选用uuid作为主键生成器
7,如果可能,选用基于version的乐观锁策略代替悲观锁
8,开发过程中,打开hibernate.show_sql
4.1 hibernate基础语义
Configuration
Configuration config = new Configuration().configure();
File file = new File("c:\\sample\\myhibernate.xml");
Configuration config = new Configuration().configure(file);
SessionFactory
Configuration config = new Configuration().configure();
SessionFactory sessionFactory = config.buildSessionFactory();
采用线程安全的设计,可由多个线程并发调用,大多情况下,一个应用中针对一个数据库
共享一个sessionFactory实例即可。
Session
非线程安全,一个session实例同时可有一个线程实用。
Session session = sessionFactory.openSession();
save,get,delete,find(hibernate2),hibernate3-->Query,Criteria
4.2 基础配置
SessionFactory配置
数据库连接配置
数据库连接池的配置
默认数据库连接池
hibernate.connection.pool_size 2
c3p0
dbcp
proxool
事务管理
使用jdbc的事务处理机制
hibernate.transaction.factory_class
net.sf.hibernate.transaction.JDBCTransactionFactory
实用JTA
hibernate.transaction.factory_class
net.sf.hibernate.transaction.JTATransactionFactory
jta.UserTransaction jta/usertransaction
可选配置项
4.3 hibernate O/R映射
基本数据类型
实体映射
实体映射基础
表名--类名映射
主键映射
字段映射
高级映射技术
自定义数据类型
UserType
CompositeUserType
复合主键
基于实体类属性的复合主键
blob,clob字段的映射
实体映射策略
4.4 数据关联
一对一
主键关联
1,一对一节点映射 , 级联关系
2,foreign主键生成,一对一映射节点,约束
唯一外键关联
1,many-to-one,unique
2,one-to-one
一对多
单向一对多,双向一对多
多对多
4.5 hibernate数据检索
Criteria Query
复合查询:
Criteria criteria = session.createCriteria(TUser.class);
Criteria addrCriteria = criteria.createCriteria("address");
addrCriteria.add(Expression.like("address","%ShangHai%"));
DetachedCriteria
脱离session。
DetachedCriteria deCriteria = DetachedCriteria.forClass(TUser.class);
deCriteria.add(Expression.eq("name","...."));
DetachedCriteria criteria = deCriteria.getExecutableCriteria(session);
可用于子查询Subqueries.propertyGt("age",avgAge);
Criteria高级特性:
1,限定返回的记录范围
Criteria criteria = session.createCriteria(TUser.class);
criteria.setFirstResult(100);
criteria.setMaxResults(20);
2,分组与统计
criteria.setProjection(Projections.groupProperty("age"));
Hibernate Query Language
4.6 HQL实用技术
实体查询
属性查询
实体更新与删除
分组与排序
参数绑定
引用查询
将sql保存在配置文件中,需要调用的时候进行读取。
Query query = session.getNamedQuery("queryByName");
联合查询
子查询
数据加载方式
sql查询
4.7 自定义持久化实现
<sql-insert>
5. hibernate高级特性
5.1 hibernate持久化实现
实体对象生命周期
实体对象识别
数据缓存
hibernate数据缓存
内部缓存又称一级缓存
由hibernate自身维护的。如果需要手动干预:
session.evict
session.clear
二级缓存
可纳入缓存管理中的条件:
1,数据不会被第三方应用修改
2,数据大小在可接受的范围之内
3,数据更新率较低
4,同一数据可能会被系统频繁使用
5,非关键数据
事务管理
基于jdbc事务管理
基于jta事务管理
jta提供了跨session的事务管理能力,管理多个session的事务
悲观锁(....for update 依靠数据库的锁机制实现)
Criteria.setLockMode
Query.setLockMode
Session.lock
乐观锁(鉴于悲观锁对数据库性能的大量开销,特别是长事务而言。)
version----比较版本号,提交版本>当前版本,才予以提交。
持久层操作
数据加载
session.get/load
session.find/iterate(2)//session.createQuery().list()/session.createQuery().iterate()(3)
iterate会先找出id,然后从中找相符的记录。n+1条sql。但它会先去缓存(find出的记录)中读取,
这时候也许就是很少的select语句了。
海量数据的操作:
while(it.hasNext()){
TUser user = (TUser)it.next();
session.evict(user);
sessionFactory.evict(TUser.class,user.getId());
}
Query Cache
保存了之前查询操作执行过的select SQL,以及由此查询产生 的查询结果集。
如果数据表发生了变化,会自动将Query Cache中对应表的sql缓存废除。
只在特定的情况下产生:
1,完全相同的select sql重复执行
2,在两次查询之间,此select sql对应的库表没有发生过变化。
如果要应用它,在配置文件中配置:
<session-facotry>
<property name = "hibernate.cache.use_query_cache">true</property>
</session-factory>
之后我们在查询执行之前,query.setCacheable(true);
延迟加载
实体对象的延迟加载
hibernate中引入了CGLib作为代理机制实现的基础,其基本实现原理就是通过
有CGLib构造一个包含目标对象所有属性和方法的动态对象。通过一个中间代理
实现了数据延迟加载功能,只有当客户程序真正调用实体类的取值方法时,hibernate
才会执行数据库查询操作。
集合类型的延迟加载
Collection addSet = user.getAddresses(); 1
Iterator it = addSet.iterator(); 2
代码运行至2,真正的数据读取操作才开始执行。
hibernate 对集合类型的缓存时,首先是这个集合中所有实体的id列表(数据所有)
然后是各个实体对象。
<cache usage="read-only/read-write">
read-only(数据索引,不会将集合中的实体元素同时纳入缓存)
read-write(实体元素也纳入缓存)
属性延迟加载
配置,hibernate3中还需借助类增强器对二进制class文件进行强化处理。
数据保存
session.save 会去内部缓存中查找。
session.update detached---->persistent
session.saveOrUpdate
数据批量操作
数据批量导入
<property name = "hibernate.jdbc.batch_size">25</property>
数据批量删除
找出符合的id,再循环根据id删除,为了记录状态,删除了那些记录才这样做的。
这样导致了几个问题:
1)内存消耗,因为首先必须将所有符合条件的数据加载到内存中。
游标的hibernate批量删除:
Query query = session.createQuery(hql);
ScrollableResults scRes = query.scroll();
while(scRes.next()){....}
2)迭代删除操作的执行效率
调整hibernate.jdbc.batch_size参数解决
无法保证缓存数据的一致有效性。
Collection类型
Set 如果做删除操作,会删去符合条件的所有记录,但是我们只想删除特定的记录,那么bag
Bag 无序可重复(set,list) 先全部删除,然后插入。
idbag----collection-id
Map
List
5.2 hibernate回调与拦截机制
Interceptor 定义了hibernate中的通用拦截机制。session创建时即可以指定加载
相应的interceptor,之后此session的持久化操作动作都将首先经由拦截器捕获处理。
SessionFactory sessionFactory = config.buildSessionFactory();
Interceptor it = new MyInterceptor();
session = sessionFactory.openSession(it);
5.3 hibernate 使用技术
hibernate分页
setFirstResut setFetchSize
dialect:指定了所有底层数据库的对外统一接口。
实现getLimitString方法。
Session管理
ThreadLocal
Hibernate与Spring Framework
hibernate 常见优化策略
1,最新的hibernate版本
2,制定合理的缓存策略
3,采用合理的session管理机制 ThreadLocal
4,尽量使用延迟加载特性
5,设定合理的批处理参数(batch_size)
6,如果可能,选用uuid作为主键生成器
7,如果可能,选用基于version的乐观锁策略代替悲观锁
8,开发过程中,打开hibernate.show_sql