
hibernate
文章平均质量分 83
aitangyong
成长最快、最好的方式就是交流和总结!
展开
-
Hibernate缓存体系之查询缓存(query cache),以及list和iterate方法的区别
什么是Hibernate的查询缓存呢?想一下这样的情况:如果A用户向hibernate发出了一个select * from student where name='aty',过了一会儿B用户也发出了同样的查询语句,而在这期间student表数据没有任何的改动,也就是说A用户和B用户需要获取的数据都是相同。如果对A的查询结果进行了缓存,B用户就不用直接查数据库了,直接从缓存中获取数据即可。原创 2014-04-25 21:46:17 · 4377 阅读 · 1 评论 -
使用session.createFilter()完成one-to-many关联关系的集合过滤
使用session.createFilter()能够过滤关联实体的集合。A collection filter is a special type of query that can be applied to a persistent collection or array. The query string can refer to this, meaning the current collection element.原创 2016-01-12 13:08:10 · 1577 阅读 · 0 评论 -
通过测试用例和执行结果,让你正确推测和理解Session中Load和get的区别,不再困惑
们知道Session是Hibernate框架的核心类,也是初学hibernate时最重要、接触最多的类,它提供了load()和get()方法,根据主键从数据库中查询记录。这2个方法存在一些特性和差别,需要开发者注意,否则很容易出错。网上有很多介绍load和get区别的帖子,虽然很多帖子介绍的都很好,但遗憾的是缺少对应单元测试和执行结果的佐证,而且有些博客之间还是相互矛盾的.原创 2014-04-17 01:27:51 · 2810 阅读 · 2 评论 -
谈一点我对hibernate关联关系映射的看法
一旦在实体映射文件中配置好关联关系后,当访问关联实体的时候,hibernate会发出查询语句再次查询关联的实体,除非我们自己去设置关联的实体对象。使用filter或者where,既可以实现关联实体的懒加载,也能够实现关联实体的过滤,由于where不能参数化所以没有什么用,filter虽然略显繁琐,但是综合起来看应该是最佳选择了。原创 2016-01-10 21:10:15 · 1014 阅读 · 0 评论 -
了解hibernate的Criteria查询
hibernate提供的Criteria查询更加符合面向对象的做法。当访问college对象关联的studens时候,hibernate还是会发出一个查询语句,返回college下的所有student。如果要实现过滤功能,需要使用hibernate中的ResultTransformer。通过Criteria关联查询可以看出:一旦在实体映射文件中配置好关联关系后,当访问关联实体的时候,hibernate会发出查询语句再次查询关联的实体,除非我们自己去设置关联的实体对象。原创 2016-01-10 20:26:45 · 1376 阅读 · 0 评论 -
hibernate one-to-many关联查询<set>中使用filter
我们将<filter-def>放在了Student的实体映射文件中,然后在College的实体映射文件<set>中引用过滤器。经过我的验证,这样也是可以的。由此可以看出:<filter-def>是一个全局效果,无论放在哪儿个实体映射文件,效果都是一样的。有一点需要特别注意:<set>的fetch有3个可选值:select、join、subselect。如果将fetch设置成join,那么过滤器失效。设置成select和subselect都是可以过滤的。原创 2016-01-10 17:46:25 · 4159 阅读 · 0 评论 -
了解hibernate的特性:filter
filter顾名思义,就是只从数据库查询出满足条件的数据,其实就是select语句中的where条件。使用HQL、SQL或者Criteria查询等,是可以很方便地设置查询条件的,所以filter实际上也并没有什么用处。使用SQL或者HQL等方案,必需将查询条件写死在java代码里,而使用filter是将查询条件写在实体映射文件中的。也就是说filter将一些逻辑从代码中转移到配置文件。原创 2016-01-09 21:51:49 · 2814 阅读 · 0 评论 -
hibernate中的实体名以及动态实体dynamic models
对于POJO实体类来说,类的全限定名就是实体类的名称。我们可以不用写实体类,而是使用Map来替代,Map比实体类具有更大的灵活性。在实体映射文件中,通过<class>元素的entity-name属性来设置实体名称。原创 2016-01-09 22:33:18 · 3308 阅读 · 0 评论 -
使用注解风格学习Hibernate和JPA的4种主键生成策略
Hibernate内置了很多主键生成策略,这些策略可以分为两类:一类是JPA标准的主键生成策略,一类是Hibernate框架特有的主键生成策略。JPA标准策略有4种:auto策略、table策略、sequence策略、identity策略;余下的都是hibernate自己的策略,包括我们常用的native、uuid、assigned、sequence等。原创 2014-04-19 23:15:47 · 2276 阅读 · 0 评论 -
Hibernate的FlushMode与session.flush()
正是由于hibernate的这种缓存机制,在同一个session中多次修改一个记录,最终只会向数据库发出一条update语句。由于session缓存以及脏数据检查机制,能够帮助我们尽可能少地发出SQL语句。FlushMode提供了4种缓存模式:MANUAL、COMMIT、AUTO和ALWAYS。最常用其实是MANUAL和COMMIT策略,如果使用了MANUAL,切记需要手动刷新session缓存。原创 2016-01-08 16:54:07 · 5680 阅读 · 1 评论 -
我对autocommit以及select语句是否需要加事务的一点理解
如果开启了autocommit,数据库服务器自动开启事务(每一条sql语句开始执行的时候),自动提交事务(sql语句执行成功),自动回滚事务(sql语句执行失败)。很显然:autocommit没有什么实际意义,如果要使用事务,就必需关闭autocommit,不然每一条sql都是一个独立的事务,而实际上事务包含了一组sql语句。最佳实践:对于DML操作,我们需要显示开始、显示提交或者回滚事务,哪儿怕事务里面只有一条sql语句。我们知道:一个数据库连接可以开启多个数据库事务。至于一个数据库事务里面多次查询结果是原创 2016-01-08 13:17:11 · 16177 阅读 · 2 评论 -
hibernate的查询缓存和二级缓存的配合使用
只开启查询缓存,不开启二级缓存是没有意义的。上一篇博客可以看出,不开启二级缓存,iterate()方法存在N+1次数据库查询问题,list方法最多只能命中id,也需要N次数据库查询,无论是哪儿种情况,查询缓存已经失去了意义。通过开启查询缓存和二级缓存,同样的sql查询可以直接使用查询缓存中的id和二级缓存中的实体对象,能够有效的减少重复的数据库查询,能够提高查询效率。也就是说:同时开启查询缓存和二级缓存是有意义的,也是实际使用hibernate的最佳配置。原创 2014-04-25 23:55:16 · 1563 阅读 · 0 评论 -
session.clear()与session.flush的区别
session.clear()方法负责清空session缓存中的实体对象,不管缓存中数据是否与数据库记录一致;session.flush()方法负责同步session缓存中的实体对象与数据库记录,保持数据的一致性。原创 2014-04-17 16:33:15 · 2500 阅读 · 0 评论 -
spring中使用HibernateTemplate或HibernateDaoSupport报类型转换错误
spring中使用HibernateTemplate或HibernateDaoSupport报类型转换错误。数据类型一定要与实体类的字段类型一致。原创 2015-07-10 17:55:21 · 1721 阅读 · 0 评论 -
Hibernate实体对象的三种状态以及困惑
Hibernate官方文档manaul中提到,hibernate实体有三种状态:Transient、Persistent、Detached。本文参考了官网手册和http://blog.youkuaiyun.com/hgd250/article/details/2775943这篇博客。1、Transient状态 An object is transient if it has just原创 2014-04-16 20:33:00 · 2467 阅读 · 3 评论 -
hibernate预编译SQL语句中的setParameter和setParameterList
使用预编译SQL语句和占位符参数(在jdbc中是?),能够避免因为使用字符串拼接sql语句带来的复杂性。我们先来简单的看下,使用预编译SQL语句的好处。使用String sql = "select * from Student where name=" + name;如果name的值是1或 "aty"或"aty'aty",就会产生下面错误的sql--ORA-01722 invalid numb原创 2014-08-22 11:16:00 · 13050 阅读 · 0 评论 -
了解hibernate中的native SQL查询
hibernate中使用native SQL:能够返回多个实体对象,能够关联查询。原创 2016-01-14 11:43:06 · 3284 阅读 · 0 评论