Hibernate中多种方式解除延迟加载
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Hibernate中多种方式解除延迟加载,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含10949字,纯文字阅读大概需要16分钟。
内容图文
![Hibernate中多种方式解除延迟加载](/upload/InfoBanner/zyjiaocheng/1118/514b705add4d4aaa944d36c505055c49.jpg)
问题引发:因为dao使用load(),默认延迟加载的,当在biz关闭session之后,UI层无法获取对象的非id属性值
解决方案:
1.变成get,即时加载
2.用Hibernate.isInitialized(obj)被初始化
3.类级别的lazy属性设为true
4.用final修饰类,因为用final修饰的类不允许有子类。而我们所说的内存中保存的代理对象其实就是该类的子类。此方法从根本上解决了延迟加载
5.在事务提交之前,先调用一下该类的非id属性
![技术分享](/upload/getfiles/default/2022/11/8/20221108084502378.jpg)
![技术分享](/img/jian.gif)
1 package cn.happy.entity; 2 3 public class Users { 4 private Integer id; 5 private String name; 6 private String password; 7 private String telephone; 8 private String userName; 9 private String isAdmin; 10 11 12 public Integer getId() { 13 return id; 14 } 15 16 public void setId(Integer id) { 17 this.id = id; 18 } 1920public String getName() { 21return name; 22 } 2324publicvoid setName(String name) { 25this.name = name; 26 } 2728public String getPassword() { 29return password; 30 } 3132publicvoid setPassword(String password) { 33this.password = password; 34 } 3536public String getTelephone() { 37return telephone; 38 } 3940publicvoid setTelephone(String telephone) { 41this.telephone = telephone; 42 } 4344public String getUserName() { 45return userName; 46 } 4748publicvoid setUserName(String userName) { 49this.userName = userName; 50 } 5152public String getIsAdmin() { 53return isAdmin; 54 } 5556publicvoid setIsAdmin(String isAdmin) { 57this.isAdmin = isAdmin; 58 } 5960 }
![技术分享](/upload/getfiles/default/2022/11/8/20221108084502378.jpg)
![技术分享](/img/jian.gif)
1 <?xml version="1.0"?> 2 <!DOCTYPE hibernate-mapping PUBLIC 3 "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 4 "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> 5 6 7 <hibernate-mapping package="cn.happy.entity"> 8 9 <class name="Users" table="USERS" lazy="false"> 10 <id name="id" column="ID"> 11 <generator class="native" /> 12 </id> 13 <property name="name" type="string" column="NAME" /> 14 <property name="password" /> 15 <property name="telephone" /> 16 <property name="userName" /> 17 <property name="isAdmin" /> 18 </class> 1920 </hibernate-mapping>
![技术分享](/upload/getfiles/default/2022/11/8/20221108084502378.jpg)
![技术分享](/img/jian.gif)
1 package cn.happy.dao; 2 3 import java.io.Serializable; 4 5 import cn.happy.until.HibernateUtil; 6 7 public class UsersDao { 8 // 添加用户记录 9 public Serializable save(Object object){ 10 return HibernateUtil.currentSession().save(object); 11 } 12 // 检索oid 13 public Object get(Class clazz, Serializable id){ 14 return HibernateUtil.currentSession().load(clazz, id); 15 } 16 17 // 修改用户记录 18 public void update(Object object){ 19 HibernateUtil.currentSession().update(object); 20 } 21 22 }
![技术分享](/upload/getfiles/default/2022/11/8/20221108084502378.jpg)
![技术分享](/img/jian.gif)
1 package cn.happy.biz; 2 3 import java.io.Serializable; 4 5 import org.hibernate.Hibernate; 6 import org.hibernate.Transaction; 7 8 import cn.happy.dao.UsersDao; 9 import cn.happy.until.HibernateUtil; 10 11 public class UsersBiz { 12 UsersDao user=new UsersDao(); 13//添加用户记录14public Serializable save(Object object){ 15 Transaction tx=HibernateUtil.currentSession().beginTransaction(); 16 Serializable result=user.save(object); 17 tx.commit(); 18return result; 19 } 20//检索oid21public Object get(Class clazz, Serializable id){ 22 Transaction tx = HibernateUtil.currentSession().beginTransaction(); 23 Object obj=user.get(clazz, id); 24// if(!Hibernate.isInitialized(obj)){ 25// Hibernate.initialize(obj); 26// }27 tx.commit(); 28 HibernateUtil.closeSession(); 29return obj; 30 } 3132//修改用户记录33publicvoid update(Object object){ 34 Transaction tx=HibernateUtil.currentSession().beginTransaction(); 35 user.update(object); 36 tx.commit(); 37 } 38 }
![技术分享](/upload/getfiles/default/2022/11/8/20221108084502378.jpg)
![技术分享](/img/jian.gif)
1 package cn.happy.ui; 2 3 import org.hibernate.Session; 4 import org.hibernate.SessionFactory; 5 import org.hibernate.Transaction; 6 import org.hibernate.cfg.Configuration; 7 8 import cn.happy.biz.UsersBiz; 9 import cn.happy.entity.Users; 10 import cn.happy.until.HibernateUtil; 11 12 public class Test { 13 public static void main(String[] args) { 14 get(); 15 } 16 // 添加 17 public static void add(){ 18 Users user=new Users(); 19 user.setName("回青"); 20 user.setIsAdmin("yes"); 21 user.setPassword("123456"); 22 user.setTelephone("18265808945"); 23 user.setUserName("户梦艳"); 24 UsersBiz usersBiz=new UsersBiz(); 25 usersBiz.save(user); 26 System.out.println("ok"); 2728 } 29//修改30publicstaticvoid modify(){ 31 Session session = HibernateUtil.currentSession(); 32 Transaction transaction = session.beginTransaction(); 33 Users user = (Users)session.get(Users.class, 6); 34 user.setName("岁月静好"); 35 session.update(user); 36 transaction.commit(); 37 HibernateUtil.closeSession(); 38 } 3940// 41publicstaticvoid get(){ 42 UsersBiz ub=new UsersBiz(); 43 Users user = (Users)ub.get(Users.class, 6); 44 System.out.println(user.getName()); 45 } 46 }
6.用openSessionInView模式
Open Session In View模式的主要思想:在用户的每一次请求过程始终保持 一个Session对象打开着
过滤器:过滤用的。过滤请求和响应。双向过滤
实现步骤:
Until包
![技术分享](/upload/getfiles/default/2022/11/8/20221108084502378.jpg)
![技术分享](/img/jian.gif)
1 package cn.happy.until; 2 3 import org.hibernate.Session; 4 import org.hibernate.SessionFactory; 5 import org.hibernate.cfg.Configuration; 6 7 public class HibernateUtil { 8 private static final ThreadLocal sessionTL=new ThreadLocal(); 9privatestatic Configuration configuration; 10privatefinalstatic SessionFactory sessionFactory; 11static{ 12 configuration=new Configuration().configure(); 13 sessionFactory=configuration.buildSessionFactory(); 14 } 15publicstatic Session currentSession(){ 16 Session session=(Session)sessionTL.get(); 17//如果session为null,则打开一个新的session18if(session==null){ 19 session=sessionFactory.openSession(); 20 sessionTL.set(session); 21 } 22return session; 23 } 24publicstaticvoid closeSession(){ 25 Session session=(Session)sessionTL.get(); 26 sessionTL.set(null); 27 session.close(); 28 } 29 }
![技术分享](/img/jian.gif)
1 package cn.happy.entity; 2 3 public class Users { 4 private Integer id; 5 private String name; 6 private String password; 7 private String telephone; 8 private String userName; 9 private String isAdmin; 10 11 12 public Integer getId() { 13 return id; 14 } 15 16 public void setId(Integer id) { 17 this.id = id; 18 } 1920public String getName() { 21return name; 22 } 2324publicvoid setName(String name) { 25this.name = name; 26 } 2728public String getPassword() { 29return password; 30 } 3132publicvoid setPassword(String password) { 33this.password = password; 34 } 3536public String getTelephone() { 37return telephone; 38 } 3940publicvoid setTelephone(String telephone) { 41this.telephone = telephone; 42 } 4344public String getUserName() { 45return userName; 46 } 4748publicvoid setUserName(String userName) { 49this.userName = userName; 50 } 5152public String getIsAdmin() { 53return isAdmin; 54 } 5556publicvoid setIsAdmin(String isAdmin) { 57this.isAdmin = isAdmin; 58 } 5960 }
entity包
![技术分享](/upload/getfiles/default/2022/11/8/20221108084502378.jpg)
![技术分享](/img/jian.gif)
1 package cn.happy.entity; 2 3 public class Users { 4 private Integer id; 5 private String name; 6 private String password; 7 private String telephone; 8 private String userName; 9 private String isAdmin; 10 11 12 public Integer getId() { 13 return id; 14 } 15 16 public void setId(Integer id) { 17 this.id = id; 18 } 1920public String getName() { 21return name; 22 } 2324publicvoid setName(String name) { 25this.name = name; 26 } 2728public String getPassword() { 29return password; 30 } 3132publicvoid setPassword(String password) { 33this.password = password; 34 } 3536public String getTelephone() { 37return telephone; 38 } 3940publicvoid setTelephone(String telephone) { 41this.telephone = telephone; 42 } 4344public String getUserName() { 45return userName; 46 } 4748publicvoid setUserName(String userName) { 49this.userName = userName; 50 } 5152public String getIsAdmin() { 53return isAdmin; 54 } 5556publicvoid setIsAdmin(String isAdmin) { 57this.isAdmin = isAdmin; 58 } 5960 }
![技术分享](/upload/getfiles/default/2022/11/8/20221108084502378.jpg)
![技术分享](/img/jian.gif)
1 <?xml version="1.0"?> 2 <!DOCTYPE hibernate-mapping PUBLIC 3 "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 4 "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> 5 6 7 <hibernate-mapping package="cn.happy.entity"> 8 9 <class name="Users" table="USERS"> 10 <id name="id" column="ID"> 11 <generator class="native" /> 12 </id> 13 <property name="name" type="string" column="NAME" /> 14 <property name="password" /> 15 <property name="telephone" /> 16 <property name="userName" /> 17 <property name="isAdmin" /> 18 </class> 1920 </hibernate-mapping>
Dao包
![技术分享](/upload/getfiles/default/2022/11/8/20221108084502378.jpg)
![技术分享](/img/jian.gif)
1 package cn.happy.dao; 2 3 import java.io.Serializable; 4 5 import cn.happy.until.HibernateUtil; 6 7 public class UsersDao { 8 // 添加用户记录 9 public Serializable save(Object object){ 10 return HibernateUtil.currentSession().save(object); 11 } 12 // 检索oid 13 public Object get(Class clazz, Serializable id){ 14 return HibernateUtil.currentSession().load(clazz, id); 15 } 16 17 // 修改用户记录 18 public void update(Object object){ 19 HibernateUtil.currentSession().update(object); 20 } 21 22 }
Biz包
![技术分享](/upload/getfiles/default/2022/11/8/20221108084502378.jpg)
![技术分享](/img/jian.gif)
1 package cn.happy.biz; 2 3 import java.io.Serializable; 4 5 import org.hibernate.Hibernate; 6 import org.hibernate.Transaction; 7 8 import cn.happy.dao.UsersDao; 9 import cn.happy.until.HibernateUtil; 10 11 public class UsersBiz { 12 UsersDao user=new UsersDao(); 13//添加用户记录14public Serializable save(Object object){ 15 Transaction tx=HibernateUtil.currentSession().beginTransaction(); 16 Serializable result=user.save(object); 17 tx.commit(); 18return result; 19 } 20//检索oid21public Object get(Class clazz, Serializable id){ 22//Transaction tx = HibernateUtil.currentSession().beginTransaction();23 Object obj=user.get(clazz, id); 24// if(!Hibernate.isInitialized(obj)){ 25// Hibernate.initialize(obj); 26// } 27//tx.commit(); 28//HibernateUtil.closeSession();29return obj; 30 } 3132//修改用户记录33publicvoid update(Object object){ 34 Transaction tx=HibernateUtil.currentSession().beginTransaction(); 35 user.update(object); 36 tx.commit(); 37 } 38 }
Filter包
![技术分享](/upload/getfiles/default/2022/11/8/20221108084502378.jpg)
![技术分享](/img/jian.gif)
1 package cn.happy.filter; 2 3 import java.io.IOException; 4 5 import javax.servlet.Filter; 6 import javax.servlet.FilterChain; 7 import javax.servlet.FilterConfig; 8 import javax.servlet.ServletException; 9 import javax.servlet.ServletRequest; 10 import javax.servlet.ServletResponse; 11 12 import org.hibernate.HibernateException; 13 import org.hibernate.Session; 14 import org.hibernate.Transaction; 15 16 import cn.happy.until.HibernateUtil; 17 18 public class OpenSessionInViewFilter implements Filter { 192021publicvoid doFilter(ServletRequest request, ServletResponse response, 22 FilterChain chain) throws IOException, ServletException { 23 request.setCharacterEncoding("utf-8"); 24 Session session=null; 25 Transaction tx=null; 26try { 27 session=HibernateUtil.currentSession(); 28 System.out.println("filter\t"+session.hashCode()); 29 tx=session.beginTransaction(); 30//执行请求处理链 双向过滤31 chain.doFilter(request, response); 32//返回响应 提交事务33 tx.commit(); 34 } catch (HibernateException e) { 35 e.printStackTrace(); 36 tx.rollback(); 37 }finally{ 38 HibernateUtil.closeSession(); 39 } 4041 } 4243publicvoid init(FilterConfig arg0) throws ServletException { 44// TODO Auto-generated method stub4546 } 47publicvoid destroy() { 48// TODO Auto-generated method stub4950 } 515253 }
原文:http://www.cnblogs.com/hmy-1365/p/5773530.html
内容总结
以上是互联网集市为您收集整理的Hibernate中多种方式解除延迟加载全部内容,希望文章能够帮你解决Hibernate中多种方式解除延迟加载所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。