`

级联操作以及session延迟关闭

阅读更多
首页说级联操作的基本配置:
在实体中定义操作关联的对象
实体:

package com.tosit.ligc.entity;

import java.util.Date;
import java.util.Set;

public class Part {
	private Integer part_id;
	private Integer par_Part_id;
	private String part_name;
	private String part_content;
	private Date part_time;
	private String part_img;
	private Set<Part> part;
	private Set<Img> img;
	
	public Set<Part> getPart() {
		return part;
	}
	public void setPart(Set<Part> part) {
		this.part = part;
	}
	private Set<News> newsset;

	public Set<Img> getImg() {
		return img;
	}
	public void setImg(Set<Img> img) {
		this.img = img;
	}
	public Set<News> getNewsset() {
		return newsset;
	}
	public void setNewsset(Set<News> newsset) {
		this.newsset = newsset;
	}
	public Integer getPart_id() {
		return part_id;
	}
	public Part() {
		super();
	}
	public void setPart_id(Integer part_id) {
		this.part_id = part_id;
	}
	
	public String getPart_name() {
		return part_name;
	}
	public void setPart_name(String part_name) {
		this.part_name = part_name;
	}
	public String getPart_content() {
		return part_content;
	}
	public void setPart_content(String part_content) {
		this.part_content = part_content;
	}
	public Date getPart_time() {
		return part_time;
	}
	public void setPart_time(Date part_time) {
		this.part_time = part_time;
	}
	
	public Integer getPar_Part_id() {
		return par_Part_id;
	}
	public void setPar_Part_id(Integer par_Part_id) {
		this.par_Part_id = par_Part_id;
	}
	public String getPart_img() {
		return part_img;
	}
	public void setPart_img(String part_img) {
		this.part_img = part_img;
	}	
}


package com.tosit.ligc.entity;

public class Img {

	private Integer img_id;
	private String img_url;
	private String img_title;
	private Integer news_id;
	private Integer foods_id;
	private Integer stay_id;
	private Part part;
	
	public Part getPart() {
		return part;
	}
	public void setPart(Part part) {
		this.part = part;
	}
	public Integer getImg_id() {
		return img_id;
	}
	public void setImg_id(Integer img_id) {
		this.img_id = img_id;
	}
	public String getImg_url() {
		return img_url;
	}
	public void setImg_url(String img_url) {
		this.img_url = img_url;
	}
	public String getImg_title() {
		return img_title;
	}
	public void setImg_title(String img_title) {
		this.img_title = img_title;
	}
	public Integer getNews_id() {
		return news_id;
	}
	public void setNews_id(Integer news_id) {
		this.news_id = news_id;
	}
	public Integer getFoods_id() {
		return foods_id;
	}
	public void setFoods_id(Integer foods_id) {
		this.foods_id = foods_id;
	}
	public Integer getStay_id() {
		return stay_id;
	}
	public void setStay_id(Integer stay_id) {
		this.stay_id = stay_id;
	}		
}


配置文件:
Part.hbm.xml:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
        <!-- package 实体所在的包名 -->
      <hibernate-mapping package="com.tosit.ligc.entity">
      	<class name="Part" table="part">
      		<id name="part_id">
      			<generator class="increment"></generator>
      		</id>
      		<property name="part_name"></property>
      		<property name="part_content"></property>
      		<property name="part_time" ></property>
      		<!-- 级联操作 -->
      		<!-- 延迟加载 -->
      		<many-to-one name="par_Part_id" class="Part" column="par_Part_id" lazy="proxy" not-null="true" >
        	</many-to-one>
      		
      		<set name="part" table="part" cascade="all"  inverse="true">
<!--cascade: 它用于指定如何操纵与当前对象关联的其他对象 all表示所有,还有save-update persist,merge,delete等等 Inverse:负责控制关系,默认为false,也就是关系的两端都能控制,如果为ture表示把 关系交给对方控制,一般情况为true not-null表示保存时候不能为空 -->
      			<key column="par_Part_id" not-null="true"></key>
      			<one-to-many class="Part" />
      		
      		</set>
      		
      		<set name="img" table="img" cascade="all"  inverse="true">
      			<key column="part_id"></key>
      		<one-to-many class="Img"/>
      		</set>	
      	</class>	
      </hibernate-mapping> 

Img.hbm.xml:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
        <hibernate-mapping package="com.tosit.ligc.entity">
        	<class name="Img" table="img">
        	<id name="img_id">
        	<generator class="native"></generator>
        	</id>
        	<property name="img_url"></property>
        	<property name="img_title"></property>
        	<property name="news_id"></property>
        	<property name="foods_id"></property>
        	<property name="stay_id"></property>
        	<many-to-one name="part" class="Part" column="part_id" lazy="proxy" not-null="true"/>
        	</class>
      </hibernate-mapping>

写代码的时候,在Controller中使用关联表的数据是否报no session错误。百度一下是因为在applicationContext.xml 中用来延迟加载
default-lazy-init="true" default-autowire="byName">
<!-- 是否延迟加载。通过名字实现自动装配 -->
在控制器调用的时候就会报no session 错误。因为session 在hibernate执行之后会自动关闭。所以找不到

package com.tosit.ligc.web;

import java.util.HashSet;
import java.util.List;
import java.util.Set;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.jdbc.core.metadata.HanaCallMetaDataProvider;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;

import com.tosit.ligc.entity.News;
import com.tosit.ligc.entity.Part;
import com.tosit.ligc.service.PartService;
@Controller
public class PartController {
	@Autowired
	@Qualifier("partService")
	private PartService partService;
	/**
	 获取一级栏目信息
	 */
	@RequestMapping("/index")
	public  String index(ModelMap map){
    List<Part>	partlist =	partService.getPartlist();
	map.put("partlist", partlist);
	return "index";
	}
	/**
	 * 获取二级栏目信息
	 * 
	 */
	@RequestMapping("/onePart")
	public String onePart(ModelMap map,@RequestParam(value="id")Integer id){
		String result = "index";
		List<Part> onelist = partService.getPartlist(id);
		map.put("onelist", onelist);
		if(id==1){
			result="index";
		}else{
			result ="Second/Lj-NewList";
		}
		return result;
		
	}
	/**
	 * 获取动态信息
	 * 
	 */
	
	@RequestMapping("/newslist")
	public String newslist(ModelMap map,@RequestParam(value="id")Integer id){
		this.index(map);
		List<News> list = partService.getnewlist(id);
		map.put("list", list);
		return "Second/Lj-NewList";
	}
	
}


解决方案:在web.xml 配置一个过滤器。是hibernate自带的一个session延迟关闭过滤。注意的是在hibernate3和hibernate4配置的不一样。当然还有一种就是把延迟加载关闭,但是这样数据大了之后,造成服务器运行效率级低。

<!-- 可以使spring自动事务延迟到视图解析后(用完数据后)才关闭 ,解决hibernate的延迟加载问题-->
	<filter>
		<filter-name>osivFilter</filter-name>
		<filter-class>org.springframework.orm.hibernate4.support.OpenSessionInViewFilter</filter-class>
		<init-param>
			<!-- 指定过滤器使用的sessionFactory bean id,默认就是sessionFactory -->
			<param-name>sessionFactoryBeanName</param-name>
			<param-value>sessionFactory</param-value>
		</init-param>
	</filter>
	<filter-mapping>
		<filter-name>osivFilter</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>









分享到:
评论

相关推荐

    Hibernate的缓存级联查询

    一级缓存是基于Session的,它保存了自Session打开以来所有操作的对象状态,减少了对数据库的直接访问。Session提供`evict`和`clear`方法来管理缓存内容。二级缓存则基于SessionFactory,能在进程甚至集群间共享数据...

    hibernate笔记--云图智联

    工具类用于创建Mybatis的session工厂并关闭session,以管理数据库连接。 ###Mybatis的映射文件配置 对象映射文件配置包括SQL语句、映射规则以及结果集映射等。通过映射文件可以完成复杂的SQL操作,将查询结果直接...

    Hibernate lazy延迟加载

    2. **初始化时机**:懒加载只能在session打开状态下工作,一旦session关闭,尝试访问懒加载属性将会抛出`LazyInitializationException`异常。因此,需要确保在业务逻辑中合理安排初始化关联数据的时间点。 3. **透明...

    hibernate教程ppt及案列

    3. **Session接口**:学习Session的创建、打开和关闭,以及使用Session进行CRUD(创建、读取、更新、删除)操作的基本方法。 **三、Hibernate4 案例分析** 1. **简单对象的增删改查**:通过创建一个简单的User实体...

    hibernate入门实例

    `SessionFactory`通常在应用启动时创建一次,`Session`在每次数据库操作时打开和关闭。 6. **CRUD操作** - **Create(创建)**: 使用`Session.save()`或`Session.persist()`方法保存新对象到数据库。 - **Read...

    hibernate的课件及应用

    6. **级联操作**: 可以配置实体间的级联操作,如保存、删除一个对象时,其关联的对象也会被相应操作。 7. **自动建表和反向工程**: Hibernate可以通过元数据自动创建数据库表结构,也可以将现有数据库反向工程为...

    Hibernate手册

    - **脱管态**: 对象之前是持久态,但当前 Session 已关闭,对象与数据库的连接断开。 **关联管理** Hibernate 支持多种类型的关联,包括一对一、一对多、多对一和多对多。关联可以通过 XML 映射文件或注解来配置,...

    hibernate入门

    在实际应用中,我们通常在每个业务事务中创建一个Session,完成操作后关闭。 接下来,我们来看看Hibernate如何执行查询。最基础的是HQL(Hibernate Query Language),它是Hibernate提供的面向对象的查询语言,类似...

    hibernate3.2中文开发手册

    7. **级联操作与缓存策略**:理解级联操作(cascade)的概念,它可以将操作传播到关联的对象上。同时,Hibernate提供了不同级别的缓存策略,包括第一级缓存和第二级缓存,以及查询缓存。 8. **性能优化**:手册会...

    Hibernate学习笔记

    除了基本的CRUD操作,Hibernate还支持级联操作、延迟加载、缓存机制、查询语言HQL(Hibernate Query Language)以及 Criteria 查询等高级特性。HQL是一种面向对象的查询语言,类似于SQL但更加面向Java对象,使得查询...

    Hibernate的学习笔记.doc

    5. 关闭Session:操作完成后,记得关闭Session,释放资源。 四、实体映射 1. 注解映射:通过@Entity、@Table、@Id等注解将Java类映射到数据库表。 2. XML映射:使用.hbm.xml文件,详细描述实体类与数据库表的对应...

    hibernate的帮助文档和API

    7. **Cascading(级联操作)和Lazy Loading(延迟加载)**:级联操作允许在一个对象的操作影响到关联的对象;延迟加载则是在需要时才加载关联对象,以提高性能。 8. **SessionFactory和Session的生命周期**:...

    hibernate API 中文(附带教程)

    2. **Session**: 实现了CRUD(创建、读取、更新、删除)操作,是短生命周期的,通常每个用户请求对应一个Session。 3. **Query 和 Criteria API**: 提供了面向对象的查询方式,包括HQL(Hibernate Query Language)...

    Hibernate总结

    6. 关闭 Session 和 SessionFactory。 **Hibernate 映射机制** Hibernate 使用 XML 文件或注解来实现对象和数据库表之间的映射。映射文件(.hbm.xml)定义了实体类和数据库表之间的对应关系,包括字段映射、主键...

    Hibernate框架

    2. Session:作为持久化操作的主要接口,Session负责管理对象的状态,包括对象的创建、更新、删除以及查询。 3. Transaction:提供事务管理,确保数据的一致性和完整性。 4. Criteria查询和HQL(Hibernate Query ...

    hibernate.rar

    7. 关闭Session:每次操作完毕,记得关闭Session,释放资源。 四、Hibernate特性 1. 缓存机制:一级缓存(Session级缓存)和二级缓存(SessionFactory级缓存),提升性能,减少数据库访问。 2. 支持懒加载(Lazy ...

    hibrenate3.6___API__zh-CN

    - 注意防止“懒加载异常”(LazyInitializationException),确保在Session关闭前使用延迟加载的数据。 本套API文档详细阐述了以上知识点,涵盖了Hibernate 3.6的各个方面,是学习和使用Hibernate 3.6的重要参考...

    hibernate的学习以及使用

    - **级联操作**: 一个对象的操作影响关联对象,如级联保存、删除等。 - **实体生命周期事件**: 可监听对象的创建、更新、删除等事件,实现业务逻辑。 学习和使用Hibernate需要掌握上述核心概念和用法,通过实际项目...

    HibernateDemo

    7. **关闭Session**: 操作完成后,关闭Session,释放资源。 **其他重要概念** 1. **级联操作(Cascading)**: 可以设置实体间的关系,比如一个实体的更改会影响到关联的实体,如`CascadeType.ALL`表示所有操作都...

    hibernate学习源码

    - **数据操作**:`Session`是Hibernate的主要工作接口,提供了增删改查(CRUD)方法,如`save()`, `update()`, `delete()`以及`load()`和`get()`。 - **事务管理**:`Session`支持事务操作,通过`beginTransaction...

Global site tag (gtag.js) - Google Analytics