先看下过程
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 (OSIV) 模式是一种在基于Hibernate的Web应用程序中处理持久化数据的策略,它允许在视图层(例如JSP页面)中安全地访问延迟加载的对象,而无需担心Session已关闭的问题。以下是关于这个模式及其...
在这个小项目中,"Open Session in View"(OSIV)模式被采用,这是一种处理持久化数据的策略,以避免在Web应用中出现常见的并发问题,如数据不一致和懒加载异常。 Struts2是一个强大的MVC框架,它提供了一种灵活的...
### Open_Session_In_View详解 #### 一、背景与概念 在使用Hibernate进行对象持久化时,经常遇到的一个问题是关于懒加载(lazy loading)的处理。懒加载是一种优化技术,允许在真正需要某个关联对象的数据时才加载...
niUSRP Open Rx Session在LabVIEW中的应用是无线通信领域常用的一种技术,它涉及到NI (National Instruments) 的Universal Software Radio Peripheral (USRP) 和LabVIEW软件的集成使用。LabVIEW,全称Laboratory ...
重定向的时候是有session丢失的问题;window.open丢失session问题;使用框架(Frameset)调用不同域名下的页面,会出现此域下页面的Cookies和Session丢失的现象。
下载此文件,然后直接双击运行,就可以去掉右键菜单中的“open in visual studio"选项
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 ...
3. **Open Session in View (OSIV)**:在视图渲染阶段保持Session打开,以允许最后时刻的懒加载,但需要注意防止Session泄露。 总的来说,Hibernate中Session的管理是保证多线程环境下数据一致性的重要环节。...
现在Ajax在Web项目中应用广泛,几乎可以说无处不在,这就带来另外一个问题:当Ajax请求遇到Session超时,应该怎么办? 显而易见,传统的页面跳转在此已经不适用,因为Ajax请求是XMLHTTPRequest对象发起的而不
【标题】"vmware-view-open-client_4.0.0-215529+dfsg.orig" 提供的是VMware View的开源客户端版本,这是一款强大的虚拟桌面基础设施(VDI)解决方案,专为远程访问和管理虚拟桌面设计。在4.0.0这个特定的版本中,它...
在Windows平台上搭建OpenACS测试环境是一项技术性较强的工作,OpenACS是一个开源的网络应用程序开发框架,主要用于构建社区、教育和协作应用。以下是一份详细的步骤指南,帮助你完成这一过程。 1. **环境准备** - ...
3. **Open Session in View(OSIV)模式** OSIV模式旨在解决Web应用中,由于用户请求可能会引发多次数据库操作,而这些操作可能跨多个HTTP请求。在这种模式下,Session在整个HTTP请求周期内保持打开状态,直到请求...
带有spring.jpa.open-in-view和JDBCTemplate的意外问题的复制者这个仓库是一个最小的Spring Boot应用程序,可以重现我在spring.jpa.open-in-view设置为true的真实应用程序中遇到的问题(如果Spring Boot JPA Starter...
Open IFrame In News Table 一款Chrome扩展插件,通过该插件可以右键将网页嵌入的 IFrame 框架 快速使用 新tab 页签打开。
处理Session跨域问题通常涉及到多个网站或应用之间共享用户身份验证信息。Session是Web应用程序用来存储用户特定数据的一种机制,通常存储在服务器端,而Session ID通过Cookie在客户端与服务器之间传递。当用户在...
《基于OpenDDS的发布订阅程序HelloMsg(vs2010版)详解》 在IT行业中,分布式通信系统是实现大规模、高效能应用的关键技术之一。OpenDDS(Open Data Distribution Service)是一个开源的实时数据分布服务,它提供了一...
为了解决这个问题,我们可以利用memcache(或其升级版memcached)来实现session的存储和共享,从而达到session跨服务器跨域的目的。本文将详细介绍如何基于memcache实现PHP的session方法重写。 首先,memcache是一...
《OpenDDS订阅发布C#封装详解》 OpenDDS(Open Data Distribution Service)是一个开源的分布式实时数据发布/订阅中间件,它提供了高效、可靠的数据通信服务。在C#环境中,为了方便开发者使用OpenDDS,通常会对其...
为了解决这个问题,Spring提供了一个过滤器 `OpenSessionInViewFilter` 或者 `OpenSessionInViewInterceptor`,通常简称为OSIV(Open Session In View)模式。 OSIV模式的核心思想是在Controller层和View层之间保持...