`

商品批发信息发布平台之open session in view 中级联删除问题

阅读更多

先看下过程

sort.java

public class Sort implements Serializable {
	private int id;
	private String name;
	private int grade;//类别等级
	private String descr;
	private Sort sort;//父类
	private List sorts=new ArrayList();//子类
	public int getId() {
                 ......
             }
}

 

sort.hbm.xml

 

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC 
	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- DO NOT EDIT: This is a generated file that is synchronized -->
<!-- by MyEclipse Hibernate tool integration.                   -->
<!-- Created Sun Jan 29 11:50:19 GMT-08:00 2006                         -->
<hibernate-mapping package="po">

    <class name="Sort" table="t_sort">
        <id name="id" column="id" type="int">
            <generator class="native"/>
        </id>
 
        <property name="name" column="name" type="string"  not-null="true" />
		<property name="grade" column="grade" type="int"  not-null="true" />
		<property name="descr" column="descr" type="string"  not-null="true" />
		<many-to-one name="sort" class="Sort">
		<column name="pid"></column>
		</many-to-one>
		<list name="sorts" cascade="all" >
		<key>
		<column name="pid"></column>
		</key>
		<list-index>
		<column name="sort_index" ></column>
		</list-index>
		<one-to-many class="Sort" />
		</list>
		
    </class>
    
</hibernate-mapping>

 

web.xml

 <!-- 解决hiberbate  lazy问题-->
  <filter>
    <filter-name>hibernateFilter</filter-name>
    <filter-class>util.MyOpenSessionInView</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>hibernateFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>

 MyOpenSessionInView.java

public class MyOpenSessionInView extends OpenSessionInViewFilter {

	@Override
	protected Session getSession(SessionFactory sessionFactory)
			throws DataAccessResourceFailureException {
		Session session=SessionFactoryUtils.getSession(sessionFactory, true);
		session.setFlushMode(FlushMode.COMMIT);
		return session;
	}
	protected void closeSession(Session session, SessionFactory factory) {
		session.flush();
		super.closeSession(session, factory);
		}

}

  MyOpenSessionInView.java 类是为了解决下面的错误问题。下面的问题的解决办法也有几种,在我的其他转载文章中有提到。

org.springframework.dao.InvalidDataAccessApiUsageException: Write operations are not allowed in read-only mode (FlushMode.NEVER) - turn your Session into FlushMode.AUTO or remove 'readOnly' marker from transaction definition

 

 在hibernate 删除关联时会出现

eleted object would be re-saved by cascade (remove deleted object from associations)

的异常,结合别人的和自己的经验通常有三种解决的方案:

方法1 删除Set方的cascade:
方法2 解决关联关系后,再删除

    onside.getManys().remove(thisMany);   //在所关联的一方的set中移走当前要删除的对象
   
thisMany.setOne(null);                          //设置所对应的一方为空,解除它们之间的关系
   
manyDao.delete(thisMany);

方法3 在many-to-one方增加cascade 但值不能是none

以上是我用的第2种方法的一种改进,因为在第二种方法来做的时候依然会报

eleted object would be re-saved by cascade (remove deleted object from associations)

的异常,所以我采取的办法是

public void deleteByid(int sortid) {
		this.getHibernateTemplate().delete(this.getSort(sortid));
		this.getSession().flush();
	}

 

和上面的的

<list name="sorts" cascade="all" >

这样既解决了删除的级联,也消除了上面的异常。


以上纯属个人的尝试,由于经验较少,错误的地方请指教。

分享到:
评论

相关推荐

    Open Session in View模式.PPT

    Open Session in View (OSIV) 模式是一种在基于Hibernate的Web应用程序中处理持久化数据的策略,它允许在视图层(例如JSP页面)中安全地访问延迟加载的对象,而无需担心Session已关闭的问题。以下是关于这个模式及其...

    struts2+hibernate3 open session in view

    在这个小项目中,"Open Session in View"(OSIV)模式被采用,这是一种处理持久化数据的策略,以避免在Web应用中出现常见的并发问题,如数据不一致和懒加载异常。 Struts2是一个强大的MVC框架,它提供了一种灵活的...

    Open_Session_In_View详解.doc

    ### Open_Session_In_View详解 #### 一、背景与概念 在使用Hibernate进行对象持久化时,经常遇到的一个问题是关于懒加载(lazy loading)的处理。懒加载是一种优化技术,允许在真正需要某个关联对象的数据时才加载...

    niUsrp Open Rx Session_open_LabVIEWRX_labview_

    niUSRP Open Rx Session在LabVIEW中的应用是无线通信领域常用的一种技术,它涉及到NI (National Instruments) 的Universal Software Radio Peripheral (USRP) 和LabVIEW软件的集成使用。LabVIEW,全称Laboratory ...

    session丢失解决方案

    重定向的时候是有session丢失的问题;window.open丢失session问题;使用框架(Frameset)调用不同域名下的页面,会出现此域下页面的Cookies和Session丢失的现象。

    删除右键菜单中open in visual studio

    下载此文件,然后直接双击运行,就可以去掉右键菜单中的“open in visual studio"选项

    前端开源库-open-in-editor

    `open-in-editor` 库正是为了解决这个问题而诞生的。它简化了这一过程,使得在浏览器中调试代码后,可以直接在本地编辑器中进行修改,然后快速预览效果,提升了开发的流畅性。 该库的实现原理可能包括以下部分: 1...

    Advances and Open Problems in Federated Learning.pdf

    Advances and Open Problems in Federated Learning。Federated learning (FL) is a machine learning setting where many clients (e.g. mobile devices or whole organizations) collaboratively train a model ...

    hibernate中session的管理

    3. **Open Session in View (OSIV)**:在视图渲染阶段保持Session打开,以允许最后时刻的懒加载,但需要注意防止Session泄露。 总的来说,Hibernate中Session的管理是保证多线程环境下数据一致性的重要环节。...

    完美解决ajax访问遇到Session失效的问题

    现在Ajax在Web项目中应用广泛,几乎可以说无处不在,这就带来另外一个问题:当Ajax请求遇到Session超时,应该怎么办? 显而易见,传统的页面跳转在此已经不适用,因为Ajax请求是XMLHTTPRequest对象发起的而不

    vmware-view-open-client_4.0.0-215529+dfsg.orig

    【标题】"vmware-view-open-client_4.0.0-215529+dfsg.orig" 提供的是VMware View的开源客户端版本,这是一款强大的虚拟桌面基础设施(VDI)解决方案,专为远程访问和管理虚拟桌面设计。在4.0.0这个特定的版本中,它...

    Windows平台搭建OpenACS测试环境_步骤

    在Windows平台上搭建OpenACS测试环境是一项技术性较强的工作,OpenACS是一个开源的网络应用程序开发框架,主要用于构建社区、教育和协作应用。以下是一份详细的步骤指南,帮助你完成这一过程。 1. **环境准备** - ...

    Hibernate Session释放模式

    3. **Open Session in View(OSIV)模式** OSIV模式旨在解决Web应用中,由于用户请求可能会引发多次数据库操作,而这些操作可能跨多个HTTP请求。在这种模式下,Session在整个HTTP请求周期内保持打开状态,直到请求...

    osiv-reproducer:与spring.jpa.open-in-view和JDBCTemplate一起意外问题的最小复制者

    带有spring.jpa.open-in-view和JDBCTemplate的意外问题的复制者这个仓库是一个最小的Spring Boot应用程序,可以重现我在spring.jpa.open-in-view设置为true的真实应用程序中遇到的问题(如果Spring Boot JPA Starter...

    Open IFrame In News Table.crx

    Open IFrame In News Table 一款Chrome扩展插件,通过该插件可以右键将网页嵌入的 IFrame 框架 快速使用 新tab 页签打开。

    处理session跨域几种方案

    处理Session跨域问题通常涉及到多个网站或应用之间共享用户身份验证信息。Session是Web应用程序用来存储用户特定数据的一种机制,通常存储在服务器端,而Session ID通过Cookie在客户端与服务器之间传递。当用户在...

    基于OpenDDS的发布订阅程序HelloMsg(vs2010版)

    《基于OpenDDS的发布订阅程序HelloMsg(vs2010版)详解》 在IT行业中,分布式通信系统是实现大规模、高效能应用的关键技术之一。OpenDDS(Open Data Distribution Service)是一个开源的实时数据分布服务,它提供了一...

    PHP基于memcahe的session方法重写

    为了解决这个问题,我们可以利用memcache(或其升级版memcached)来实现session的存储和共享,从而达到session跨服务器跨域的目的。本文将详细介绍如何基于memcache实现PHP的session方法重写。 首先,memcache是一...

    opendds订阅发布c#封装1.0v

    《OpenDDS订阅发布C#封装详解》 OpenDDS(Open Data Distribution Service)是一个开源的分布式实时数据发布/订阅中间件,它提供了高效、可靠的数据通信服务。在C#环境中,为了方便开发者使用OpenDDS,通常会对其...

Global site tag (gtag.js) - Google Analytics