Hibernate备忘

Hibernate中,对于实体类,建议不要采用final修饰,这将导致hibernate代理机制的运作难以运行,而代理机制则是hibernate中提高性能的重要途径之一

Hibernate要求复合主键类实现equals和hashcode方法,以作为不同数据之间识别的标志

在关联关系中,inverse="false"的为主动方,由主动方负责维护关联关系

在one-to-many关系中,将many一方设为主控方(inverse=false)

对于设置为foreign类型的主键生成器,one-to-one节点的constrained属性必须设定为true,以告诉hibernate当前表主键上存在一个约束

fetch关键字只对inner join和left join有效,对于right join而言,由于作为关联对象容器的对象可能为null所以也就无法通过fetch关键字强制Hibernate进行集合填充操作

如果一个实体对象与某个session实例发生了关联,并处于对应session的有效期内,那么它就处于persistent状态

处于persistent状态的对象,其对应的session实例关闭之后,那么,此对象就处于detached状态,实体对象从persistent状态转变为transient状态,一般由session.delete方法完成

如果数据满足以下条件,则可将其纳入缓存管理
1.数据不会被第三方应用修改
2.数据大小在可接受的范围之内
3.数据更新频率较低
4.同一数据可能会被系统频繁引用
5.非关键数据

hibernate的加锁模式有
1.LockMode.NONE:无琐机制
2.LockMode.WRITE:hibernate在insert和update纪录的时候会自动获取
3.LockMode.READ:hibernate在读取纪录的时候会自动获取
以上这3种锁机制一般由hibernate内部使用,如hibernate 为了保证update过程中对象不会被外界修改,会在save方法实现中自动为目标对象加上write锁,这些都是hibernate 内部读数据的锁定机制,与数据库无关
4.LockMode.UPGRADE:利用数据库的for update子句加锁
5.LockMode.UPGRADE_NOWAIT:oracle的特定实现,利用oracle的for update nowait子句实现加锁

find方法实际上无法利用缓存,他对缓存只写不读,而iterate方法则可以充分发挥缓存带来的优势,如果目标数据只读或者读取相对较为频繁,通过这种机制可以大大减小性能上的损耗,但是iterate会带来N+1次查询问题

save方法不会把实体对象纳入二级缓存

对一个persistent状态的实体对象调用update语句并不会产生任何作用

内部缓存与二级缓存不同,我们可以在二级缓存的配置中制定其最大容量,但内部缓存并没有这样的限制,即不能指定缓存的最大容量

Mysql JDBC Driver不支持BatchUpdate方式,因此batch_size的设定对MySQL无效

bulk delete/update只是提供了面向高性能批量操作的一种实现途径,但无法保证缓存数据的一致有效性

session的设计是非线程安全的,也就是说,一个session实例同时只可由一个线程使用

Query和Criteria作为Hibernate数据查询接口,提供了对查询条件的封装机制,两者不同之处在于,Query面向HQL和Native SQL,而Criteria则提供了面向对象的查询模式

criteria.add(Experssion.eq(……)),Expression各方法中的属性名参数是POJO中对应实际库表字段的属性名,而非库表中的实际字段名称

criteria.add(Example.create(user)); Example对于不确定查询条件的组合查询特别有用,将自动根据user实例中非空属性生成条件查询语句

即时加载时,当宿主主体加载时,hibernate会立即自动读取其关联的数据并完成关联属性的填充

对于集合(不包括一对一)只要条件允许,我们应该尽量采用延迟加载模式

缓存同步策略可用于实体类和集合属性

Hibernate提供以下4种内置的缓存同步策略
1、read-only 只读,对于不会发生改变的数据
2、nonstrict-read-write 如果程序对并发访问下的数据同步要求不是很严格,且数据更新操作频率较低时采用
3、read-write 严格可读写缓存
4、transactional 事务型缓存,必须运行在JTA事务环境中

session.load/get方法均可以根据指定的实体类和id从数据库读取纪录,并返回与之对应的实体对象,区别在于:
1、如果未能发现符合条件的纪录,get方法返回null,而load方法会抛出一个objectnotfoundexception
2、load方法可返回实体的代理类实例,而get方法直接返回实体类
3、load方法可以利用一、二级缓存,而get方法只利用一级缓存

Query.list与Query.iterate都可用于批量查询,但list基本不利用缓存(Query Cache),除非有完全相同的select sql重复执行,而且在两次查询之间,此select sql对应的库表没有发生过改变。要使用query cache 还必须打开hibernate.cache.user_query_cache选项,且在query查询执行之前将Query.Cacheable设为true。虽然Query.iterate方法可以很好的利用缓存,但是会存在n+1次查询的问题

hibernate.initialize方法可以强制hibernate立即加载关联对象集

save方法不会把实体对象纳入二级缓存

一级缓存与二级缓存不同,一级缓存不能指定最大容量

当需要一次插入、删除或更新大量纪录的时候,可以使用hibernate的批量操作方式,设置hibernate.jdbc.batch_size参数来指定每次提交SQL的数量

hibernate中,缓存将在一下情况中发挥作用
1、通过ID加载数据,这包括了根据ID查询数据的session.load方法,以及session.iterate方法
2、延迟加载

 

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值