标签 : 8个相关结果 0次浏览

在Hibernate框架中,当我们要访问的数据量过大时,明显用缓存不太合适, 因为内存容量有限 ,为了减少并发量,减少系统资源的消耗,这时Hibernate用懒加载机制来弥补这种缺陷,但是这只是弥补而不是用了懒加载总体性能就提高了。 我们所说的懒加载也被称为延迟加载,它在查询的时候不会立刻访问数据库,而是返回代理对象,当真正去使用对象的时候才会访问数据库。    实现懒加载的前提:  1 实体类不能是final的 2 能实现懒加载的对象都是被CGLIB(反射调用)改写的代理对象,所以不能是final修饰的 3 须要asm,cglib两个jar包 4 相应的lazy属性为true 5 相应的fetch属性为select  下面几种可以实现懒加载功能: 1、   通过Session.load()实现懒加载 load(Object, Serializable):根据id查询 。查询返回的是代理对象,不会立刻访问数据库,是懒加载的。当真正去使用对象的时候才会访问数据库。 用load()的时候会发现不会打印出查询语句,而使用get()的时候会打印出查询语句。 使用load()时如果在session关闭之后再查询此对象,会报异常:could not initialize proxy – no Session。处理办法:在session关闭之前初始化一下查询出来的对象:Hibernate.initialize(user); 使用load()可以提高效率,因为刚开始的时候并没有查询数据库。但很少使用。 2、   one-to-one(元素)实现了懒加载。 在一对一的时候,查询主对象时默认不是懒加载。即:查询主对象的时候也会把从对象查询出来。 需要把主对象配制成lazy=”true” constrained=”true”  fetch=”select”。此时查询主对象的时候就不会查询从对象,从而实现了懒加载。 一对一的时候,查询从对象的是默认是懒加载。即:查询从对象的时候不会把主对象查询出来。而是查询出来的是主对象的代理对象。 3、   many-to-one(元素)实现了懒加载。 多对一的时候,查询主对象时默认是懒加载。即:查询主对象的时候不会把从对象查询出来。 多对一的时候,查询从对象时默认是懒加载。即:查询从对象的时候不会把主对象查询出来。 hibernate3.0中lazy有三个值,true,false,proxy,默认的是lazy=”proxy”.具体设置成什么要看你的需求,并不是说哪个设置就是最好的。在<many-to-one>与<one-to-one>标签上:当为true时,会有懒加载特性,当为false时会产生N+1问题,比如一个学生对应一个班级,用一条SQL查出10个学生,当访问学生的班级属性时Hibernate会再产生10条SQL分别查出每个学生对应的班级. lazy= 什么时候捉取 fetch= 捉取方式:select=关联查询;join=连接表的方式查询(效率高) fetch=join时,lazy的设置将没有意义. 4、   one-to-many(元素)懒加载:默认会懒加载,这是必须的,是重常用的。 一对多的时候,查询主对象时默认是懒加载。即:查询主对象的时候不会把从对象查询出来。 一对多的时候,查询从对象时默认是懒加载。即:查询从对象的时候不会把主对象查询出来。 需要配置主对象中的set集合lazy=”false” 这样就配置成是不懒加载了。或者配置抓取方式fetch=”join”也可以变成不懒加载。  实现懒加载的方案: 方法一:(没有使用懒加载)   用 Hibernate.initialize(de.getEmps()) 提前加载一下.  方法二: 把与Session脱离的对象重新绑定 lock()方法是用来让应用程序把一个未修改的对象重新关联到新session的方法。 //直接重新关联 session.lock(fritz,LockMode.NONE); //进行版本检查后关联 session.lock(izi,LockMode.READ); //使用SELECT… FOR UPDATE进行版本检查后关联 session.lock(pk,LockMode.UPGRADE); 方法三: OpenSessionInView 参见 http://www.javaeye.com/topic/32001           fetch 和 lazy 配置用于数据的查询  lazy 参数值常见有 false 和 true,Hibernate3映射文件中默认lazy = true ; fetch 指定了关联对象抓取的方式,参数值常见是select和join,默认是select,select方式先查询主对象,再根据关联外键,每一个对象发一个select查询,获取关联的对象,形成了n+1次查询;而join方式,是leftouter join查询,主对象和关联对象用一句外键关联的sql同时查询出来,不会形成多次查询。  在映射文件中,不同的组合会使用不同的查询:  1、lazy=”true” fetch = “select” ,使用延迟策略,开始只查询出主对象,关联对象不会查询,只有当用到的时候才会发出sql语句去查询 ; 2、lazy=”false” fetch = “select” ,没有用延迟策略,同时查询出主对象和关联对象,产生1+n条sql.  3、lazy=”true”或lazy=”false”fetch = “join”,延迟都不会作用,因为采用的是外连接查询,同时把主对象和关联对象都查询出来了.  另 外,在hql查询中,配置文件中设置的join方式是不起作用的,而在其他查询方式如get、criteria等是有效的,使用 select方式;除非在hql中指定join fetch某个关联对象。fetch策略用于get/load一个对象时,如何获取非lazy的对象/集合。 这些参数在Query中无效。

学习下Hibernate的Criteria 原文地址:http://xuganggogo.javaeye.com/blog/440078 方法说明 方法 说明 Restrictions.eq = Restrictions.allEq 利用Map来进行多个等于的限制 Restrictions.gt > Restrictions.ge >= Restrictions.lt < Restrictions.le <= Restrictions.between BETWEEN Restrictions.like LIKE Restrictions.in in Restrictions.and and Restrictions.or or Restrictions.sqlRestriction 用SQL限定查询 2,QBC常用限定方法 Restrictions.eq –> equal,等于. Restrictions.allEq –> 参数为Map对象,使用key/value进行多个等于的比对,相当于多个Restrictions.eq的效果 Restrictions.gt –> great-than > 大于 Restrictions.ge –> great-equal >= 大于等于 Restrictions.lt –> less-than, < 小于 Restrictions.le –> less-equal <= 小于等于 Restrictions.between –> 对应SQL的between子句 Restrictions.like –> 对应SQL的LIKE子句 Restrictions.in –> 对应SQL的in子句 Restrictions.and –> and 关系 Restrictions.or –> or 关系 Restrictions.isNull –> 判断属性是否为空,为空则返回true Restrictions.isNotNull –> 与isNull相反 Restrictions.sqlRestriction –> SQL限定的查询 Order.asc –> 根据传入的字段进行升序排序 Order.desc –> 根据传入的字段进行降序排序 MatchMode.EXACT –> 字符串精确匹配.相当于”like ‘value’” MatchMode.ANYWHERE –> 字符串在中间匹配.相当于”like ‘%value%’” MatchMode.START –> 字符串在最前面的位置.相当于”like ‘value%’” MatchMode.END –> 字符串在最后面的位置.相当于”like ‘%value’” 例子 查询年龄在20-30岁之间的所有学生对象 List list = session.createCriteria(Student.class) .add(Restrictions.between(“age”,new Integer(20),new Integer(30)).list(); 查询学生姓名在AAA,BBB,CCC之间的学生对象 String[] names = {“AAA”,”BBB”,”CCC”}; List list …

使用Hiberante Annotations时遇到了该问题org.hibernate.MappingException: Unknown entity在baidu和googl上搜寻了 很久也没有找到适合我的解决方法,最后发现是import Entity类造成的(使用Eclipse自动提示导入的该包) [java] import javax.persistence.Id; import javax.persistence.Table; import javax.persistence.Transient; import org.hibernate.annotations.Entity;//这是就出问题了哦 @Entity @Table(name="test_person") public class Person implements Serializable [/java] 后面修改了引入的Entity [java] import javax.persistence.Id; import javax.persistence.Table; import javax.persistence.Transient; import javax.persistence.Entity;//引入这个类就正确了 @Entity @Table(name="test_person") public class Person implements Serializable [/java] 另外有些报org.hibernate.MappingException: Unknown entity,可能是没有在cfg文件中加入 *.hbm.xml造成的,我的是这两种情况都忽略了

struts hibernate spring 几个源码项目,用来学习用,温故下hibernate,并且学学这几个框架的整合,学习别人的编程技巧等 1.本项目为最近针对高等学校校友信息资源进行管理而设计开发、基本需求比较简单,主要涉及基本信息的管理与查询,该系统采用的开发框架: Struts2.0+Hibernate+Spring+Extjs 本系统具有非常友好的人机交互界面,数据录入完全键盘化操作、可批量导入Excel数据,极大提高数据管理效率。 采用的数据库为Sql server 2005或2000均可, 跨数据库平台无需修改源码,修改数据库连接即可。 下载地址:http://download.csdn.net/source/1809013 2.易拍在线(ssh整合项目包含数据库)标准源码 是一个基于myeclipse的ssh整合项目,代码非常经典,适合正在学习的朋友使用,具有很强的完整性! 下载地址:http://download.csdn.net/source/2610482 http://download.csdn.net/down/1367837/moremoreteas ps:没有csdn账号,或是有了但没积分的,留下邮件我可以给您发过去! 3.SHOP++是基于JAVA编程语言开发的开源电子商务软件,采用Struts2、Hibernate、Spring等开源技术和自主框架技术开发。 SHOP++提供在线帮助、视频教程、支持论坛、在线客服等多种完善的技术支持和服务,SHOP++以其开源、免费;安全、稳定;强大、易用;高效、专业 等优势占据了国内JAVA电子商务系统领域的主导地位。 系统类型:B/S系统 操作系统:支持Linux、Unix、FreeBSD、Windows 2000/2003/XP等操作系统 数 据 库:支持MySQL、Oracle、SqlServer、Access等常见数据库 系统架构:MVC构架 主体框架:Spring、Struts2、Hibernate 安全框架:Spring Security 缓存框架:Oscache、Spring-modules 模板框架:Freemarker 全文检索:lucene、Compass 中文分词:IKAnalyzer 页面框架:Jquery 地址:http://www.shopxx.net

最近使用SSI框架写的系统,里面用到了很多ibatis的插入,删除等操作,几个操作经常一起,如果有一个失败了,其他的插入其实也莫有什么意义。所以想到了ibatis的事务管理,曾经也详细看过Hinbernate的事务管理。 Atomicity: 原子性 Consistency: 一致性 Isolation: 隔离性 Durability: 耐久性 iBatis中的事务分为: Automatic Transaction Local Transaction Global Transaction Custom Transaction Automatic Transaction: 默认情况下iBatis认为每个statement都是一个事务 比如 [java] public void runStatementsUsingAutomaticTransactions()      { SqlMapClient sqlMapClient =  SqlMapClientConfig.getSqlMapClient(); Person p = (Person) sqlMapClient.queryForObject("getPerson",  // 第一个事务 new Integer(9)); p.setLastName("Smith"); sqlMapClient.update("updatePerson", p); //第二个事务 } [/java] Local Transaction: 如果你想将几个statement作为一个事务来处理,可以用 startTransaction,endTransaction来划分事务 比如 [java] public void runStatementsUsingLocalTransactions() { SqlMapClient sqlMapClient = SqlMapClientConfig.getSqlMapClient(); try { sqlMapClient.startTransaction(); //事务开始 Person p = (Person)sqlMapClient.queryForObject ("getPerson", new Integer(9)); p.setLastName("Smith"); sqlMapClient.update("updatePerson", p); Department d = (Department)sqlMapClient.queryForObject ("getDept", new Integer(3)); p.setDepartment(d); sqlMapClient.update("updatePersonDept", p); sqlMapClient.commitTransaction(); </em><em><strong>//提交事务,从开始到这里是一个事务 } finally { sqlMapClient.endTransaction(); //事务结束 } [/java]

Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编 程思维来操纵数据库。Hibernate可以应用在任何使用JDBC的场合,既可以在Java的客户端程序使用,也可以在Servlet/JSP的Web 应用中使用,最具革命意义的是,Hibernate可以在应用EJB的J2EE架构中取代CMP,完成数据持久化的重任。