OpenSessionInView:由于Hibernate引入了Lazy Load特性,使得脱离Hibernate的Session周期的对象如果再想通过getter方法取到其关联对象的值,Hibernate会抛出一个LazyLoad的Exception。所以为了解决这个问题,使得Hibernate的Session的生命周期变长。
步骤:
一、创建一个web Ojbect 项目
二、数据库为MySql
CREATE TABLE `user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(50) NOT NULL,
`birthday` datetime DEFAULT NULL,
`sex` varchar(50) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=18 DEFAULT CHARSET=gb2312;
三、在MyEclipse 中添加hibernate3x jar文件,或者通过MyEclipse的支持方式加入
四、更改hibernate.cfg.xml 文件配置
<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<!-- Generated by MyEclipse Hibernate Tools. -->
<hibernate-configuration>
<session-factory>
<property name="hibernate.connection.driver_class" >com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql:///test</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">root</property>
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="hibernate.show_sql" >true</property>
<property name="hibernate.format_sql" >true</property>
<mapping resource="com/entity/User.hbm.xml" />
</session-factory>
</hibernate-configuration>
五、创建一个Hibernate获取session的工具类HibernateBase.java
package com.util;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
public final class HibernateBase {
private static SessionFactory sessionFactory;
//创建一个线程本地变量
private static ThreadLocal threadLocal = new ThreadLocal();
private HibernateBase(){}
//本地线程添加session
public static Session getThreadLocal(){
Session session = (Session) threadLocal.get();
if (session == null) {
session = getSession();
threadLocal.set(session);
}
return session;
}
public static SessionFactory getSessionFactory(){
if (sessionFactory==null) {
Configuration cf = new Configuration();
cf.configure();
sessionFactory = cf.buildSessionFactory();
}
return sessionFactory;
}
public static Session getSession(){
return getSessionFactory().openSession();
}
}
六、创建实体对象
package com.entity;
import java.util.Date;
public class User {
private Integer id;
private String name;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
private Date birthday;
private String sex;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
}
七、创建实体映射文件User.hbm.xml
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!--
Mapping file autogenerated by MyEclipse Persistence Tools
-->
<hibernate-mapping>
<class name="com.entity.User" table="user">
<!—二级缓存 <cache usage="read-only"/> -->
<id name="id" type="java.lang.Integer">
<column name="id" />
<generator class="native"></generator>
</id>
<property name="name" type="java.lang.String">
<column name="name" length="50" not-null="true" />
</property>
<property name="birthday" type="java.util.Date">
<column name="birthday"></column>
</property>
<property name="sex" type="java.lang.String">
<column name="sex" length="50" not-null="true"></column>
</property>
</class>
</hibernate-mapping>
八、创建一个通用的dao文件,HiberanteDaoImpl.java
package com.dao.impl;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import com.util.HibernateBase;
public class HiberanteDaoImpl {
private static Session session;
/**
* openSessionInView方式采用
* @param object
*/
public void addThread(Object object){
try {
session = (Session) HibernateBase.getThreadLocal();
session.save(object);
} catch (HibernateException e) {
e.printStackTrace();
}
}
/**
* openSessionInView方式采用 删除
* @param object
*/
public void delThread(Object object){
try {
session = (Session) HibernateBase.getThreadLocal();
session.delete(object);
} catch (HibernateException e) {
e.printStackTrace();
}
}
}
九、创建过滤器:主要采用过滤的方式进行OpenSessionInView.java
package com.web;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.Transaction;
import com.util.HibernateBase;
public class OpenSessionInView implements Filter {
@Override
public void destroy() {
// TODO Auto-generated method stub
}
@Override
public void doFilter(ServletRequest arg0, ServletResponse arg1,
FilterChain arg2) throws IOException, ServletException {
Session session = null;
Transaction tx = null;
try {
session = (Session) HibernateBase.getThreadLocal();
tx = session.beginTransaction();//事物开始 在视图层创建事物
arg2.doFilter(arg0, arg1);
tx.commit();
session.close();
} catch (HibernateException e) {
if (tx!=null) {
tx.rollback();
}
}finally{
//不能关闭session
}
}
@Override
public void init(FilterConfig arg0) throws ServletException {
// TODO Auto-generated method stub
}
}
十、 创建servlet文件UserServlet.java
package com.web;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Date;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.dao.impl.HiberanteDaoImpl;
import com.entity.User;
public class UserServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html");
PrintWriter out = response.getWriter();
//添加user对象 然后再删除 这里就不做视图的创建了,通过servlet简单演示
User user = new User();
user.setName("abc");
user.setBirthday(new Date());
user.setSex("男");
HiberanteDaoImpl dao = new HiberanteDaoImpl();
dao.addThread(user); //添加
dao.delThread(user); //删除
out.flush();
out.close();
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
this.doGet(request, response);
}
}
十一、 打开浏览器输入http://localhost:8080/hibernate/userServlet
分享到:
相关推荐
在Java Web开发中,Spring与Hibernate作为两个重要的框架,经常被一起使用来实现业务逻辑与数据持久化的处理。而在使用这两个框架时,为了更好地管理数据库会话(Session)生命周期,通常会采用`OpenSessionInView`...
在Hibernate中,当设置关联属性的`fetch`或`lazy`属性为`true`时,表示该关联属性采用懒加载方式。这意味着,在获取主对象时,Hibernate不会立即加载与其关联的子对象。例如,在用户(User)与帖子(Post)之间的多...
《韩顺平Spring雇员管理系统中的Hibernate ORM框架详解》 ...这个压缩包中的"hibernate jar包"是实现这些功能的关键,它包含Hibernate运行所需的类和库,是开发者在项目中使用Hibernate不可或缺的部分。
在软件开发领域,特别是Java Web开发中,Struts、Spring 和 Hibernate 被广泛地应用于构建复杂的应用程序。这三大框架各有所长,分别在不同的层面发挥作用。为了更好地利用这些框架的优势,开发者通常会采用SSH...
在Java Web开发中,OpenSessionInView(OSIV)模式是一种常见的解决数据持久化问题的设计模式,主要用于Spring框架与Hibernate等ORM工具的集成。这个模式的主要目的是解决在HTTP请求处理过程中,由于Session范围内的...
Hibernate是Java领域中一款流行的持久...以上就是Hibernate面试中常见的问题和答案,涵盖了基本概念、缓存策略、查询方式以及事务和数据访问等方面的知识点。理解并掌握这些内容对于深入学习和使用Hibernate至关重要。
#### 二、Hibernate配置中的延迟加载实现 在Hibernate的配置文件或映射文件中,可以设置关联对象的加载策略为延迟加载。比如在给定的部分内容中,`...
- **OpenSessionInView** 是Hibernate的一个重要概念,它允许在视图层打开一个Session,这样就可以在渲染视图的时候访问数据库。 - **get() 和 set() 方法** 用于对象属性的获取和设置,在文档中被用于封装实体类...
Hibernate通过以下方式实现延迟加载: - **使用懒加载代理**:对于一对多或多对多的关系,Hibernate会在需要的时候动态创建代理对象。 - **OpenSessionInView模式**:这是一种解决懒加载异常的有效方案,通过确保...
Spring框架则提供了强大的依赖注入(DI)功能,通过它可以有效地管理对象的生命周期,以及实现对应用中各种组件的解耦。 为了更好地实现Struts与Spring的整合,我们可以采用以下步骤: 1. **配置Spring管理Struts*...
关联映射是Hibernate中的高级主题,包括多对一、一对多、一对一和多对多的映射方式。在一对多的关联映射中,一个父对象可以包含多个子对象,子对象通过外键指向父对象。一对一映射可以通过在主键上使用unique属性...
在Java Web开发中,Spring、SpringMVC和Hibernate是三个非常重要的框架,它们分别负责依赖注入、Web请求处理和对象关系映射。将这三个框架整合在一起,可以构建出高效、灵活且易于维护的Web应用程序。下面将详细解析...
本方案主要探讨如何在基于Hibernate和Spring框架的环境中实现多数据库的管理,特别是在`OpenSessionInView`模式下的配置。 首先,我们看到在`applicationContext.xml`配置文件中定义了两个数据源,一个用于读操作...
- **集成方法**:在 Spring 中,可以通过 `SessionFactory` 和 `HibernateTemplate` 或 `JpaTemplate` 简化 Hibernate 的使用。`SessionFactory` 提供了创建 Session 的工厂,而 `HibernateTemplate` 或 `...
Struts、Hibernate和Spring(SSH)是Java Web开发中经典的三大框架,它们分别负责MVC模式中的模型(Model)、视图(View)和控制器(Controller)部分。在面试中,了解这些框架的核心概念和实际应用是非常重要的。 ...
OpenSessionInView(OSIV)模式是SSH整合中常见的一种优化策略,它在用户的一次HTTP请求过程中保持Hibernate Session,避免了多次打开和关闭Session,减少了N+1查询问题,提高了性能。 **Spring** 是一个全面的企业...
### Open_Session_In_View详解 #### 一、背景与概念 在使用Hibernate进行对象持久化时,经常遇到的一个问题是关于懒...通过合理配置和使用,可以大大简化Hibernate应用中的数据访问逻辑,提高开发效率和系统性能。
根据提供的文件信息,...综上所述,通过将Struts2、Hibernate和Spring框架进行整合,不仅可以充分利用每个框架的特点,还可以实现更高效、更灵活的Web应用开发。希望以上内容能帮助您更好地理解这些框架及其整合方式。
在 Spring 中,AOP 可以通过声明式的方式实现,即通过 XML 或注解配置来定义切点(Pointcut)、增强(Advice)等。 **IOC(Inversion of Control,控制反转)**: 是一种设计模式,用来降低代码之间的耦合度。在 ...