`
can4you
  • 浏览: 101426 次
  • 性别: Icon_minigender_1
  • 来自: 天朝
社区版块
存档分类
最新评论

Cascade="all-delete-orphan"以及java.util.ConcurrentModificationException问题

阅读更多

为以下两个问题提供解决:

 

1. Hibernate cascade="all-delete-orphan"应用;

2. 用Collection or List 等集合时,迭代remove操作引起的java.util.ConcurrentModificationException问题

 

 

 

	/** 修改業務系統 */
	public String updateBuinessSys() {
		modify = true;
		String transId = (String) getRequestMap().get("transId");
		if (StringUtil.isNullOrBlank(transId)) {
			context.addMessage(null, new FacesMessage("不能獲取業務系統對象"));
			return null;
		}
		Transaction transaction = transactionsManager.getTransactionById(transId);
		if (transaction != null) {
			transaction.setTransName(transName);
			transaction.setTransCode(transCode);
			transaction.setTransDesc(transDesc);
			transaction.setEnterpriseCodes(enterpriseCodes);
			transaction.setBankCodes(bankCodes);

			String transFuncXml = context.getExternalContext().getRequestParameterMap().get("transFuncXml");
			assembleTransFuncs(transFuncXml);

			Set<String> newFunIdSet = new HashSet<String>();//新增的列表id set
			Set<String> dbFunIdSet = new HashSet<String>();//DB中的列表id set
			List<TransFunction> funList = transaction.getTransFunctions();
			for (Iterator iterator = funList.iterator(); iterator.hasNext();) {
				TransFunction fun = (TransFunction) iterator.next();
				dbFunIdSet.add(fun.getId());
			}
			for (Iterator iterator = transFunList.iterator(); iterator.hasNext();) {
				TransFunction fun = (TransFunction) iterator.next();
				if (StringUtil.isNotNullOrBlank(fun.getId())) {
					newFunIdSet.add(fun.getId());
				}
			}
			/* 先remove,後add則不需要判斷fun.id為null的情況 */
			for (Iterator iterator = funList.iterator(); iterator.hasNext();) {
				TransFunction fun = (TransFunction) iterator.next();
				if (!newFunIdSet.contains(fun.getId()))//如果保存的list中的ID在DB中不存在了,即已經被刪除了,則remove from list,使之成為orphan
					//funList.remove(fun); 這一句會引起java.util.ConcurrentModificationException
					iterator.remove();
			}
			for (Iterator iterator = transFunList.iterator(); iterator.hasNext();) {
				TransFunction fun = (TransFunction) iterator.next();
				if (StringUtil.isNullOrBlank(fun.getId()) || !dbFunIdSet.contains(fun.getId()))
					funList.add(fun);//新增的記錄在DB中沒有,則認為是新增的記錄,加入到list當中去
			}

			//transaction.setTransFunctions(transFunList); 不需要重新設置,設定了all-delete-orphan即可
			transactionsManager.saveOrUpdate(transaction);
			return "viewBusinessState";
		}
		context.addMessage(null, new FacesMessage("無效的表單參數"));
		return Constants.ERROR;
	}

 

Transaction - TransFunction是一对多的关系: hbm.xml配置档如下:

 

<?xml version="1.0"  encoding='UTF-8'?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD//EN"
	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.test.domain">
	<class name="Transaction" table="SYS_TRANS">
		<id name="id" column="ID" length="32" type="string">
			<generator class="uuid" />
		</id>
		<property name="transName" column="NAME" length="30" />
		<property name="transCode" column="CODE" length="10" unique="true" />
		<property name="transDesc" column="DESCR" length="200" />
		<property name="enterpriseCodes" column="ENTP_CODES" length="1000" />
		<property name="bankCodes" column="BANK_CODES" length="1000" />
		<bag name="transFunctions" cascade="all-delete-orphan" inverse="false" lazy="false">
			<key column="TRANS_ID" />
			<one-to-many class="TransFunction" />
		</bag>
	</class>

</hibernate-mapping>

 

<?xml version="1.0"  encoding='UTF-8'?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD//EN"
	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.test.domain">
	<class name="TransFunction" table="SYS_TRANS_FUNC">
		<id name="id" column="ID" length="32" type="string">
			<generator class="uuid" />
		</id>
		<property name="funcName" column="NAME" length="30" />
		<property name="funcCode" column="CODE" length="20" unique="true" />
		<many-to-one name="transaction" column="TRANS_ID"/>
	</class>

</hibernate-mapping>

 

 

 

分享到:
评论

相关推荐

    PyPI 官网下载 | django-postgres-delete-cascade-2.0a1.tar.gz

    标题中的“PyPI 官网下载 | django-postgres-delete-cascade-2.0a1.tar.gz”表明这是一个从Python Package Index(PyPI)官方源获取的软件包,名为“django-postgres-delete-cascade”。这个软件包的版本是2.0a1,...

    hibernate_配置cascade_及all-delete-orphan.doc

    3. **all-delete-orphan**: 这是最强大的cascade选项之一,它结合了`save-update`和`delete`的特点,并增加了一个额外的功能——当子实体与父实体之间的关联被解除时,会自动删除那些不再属于任何父实体的子实体。...

    haarcascade-licence-plate-rus-16stages.xml.zip

    标题中的"haarcascade-licence-plate-rus-16stages.xml.zip"是指一个用于识别俄罗斯车牌的OpenCV Haar级联分类器文件的压缩包。OpenCV(开源计算机视觉库)是一个强大的图像处理和计算机视觉库,广泛应用于图像识别...

    opencascade-7.6.0-vc14-64.exe 官方原版,安装测试正常

    OpenCASCADE,全称为Open CASCADE Technology,是一个开源的三维几何建模和可视化软件开发工具包,广泛应用于CAD(计算机辅助设计)、CAE(计算机辅助工程)和 CAM(计算机辅助制造)领域。这个压缩包"opencascade-...

    haarcascade-frontalface-alt2.xml.zip

    标题 "haarcascade-frontalface-alt2.xml.zip" 指示我们正在处理一个与人脸识别相关的资源包。这个压缩文件包含的是OpenCV库中的一个人脸检测算法,具体来说是"haarcascade_frontalface_alt2.xml",这是一种基于特征...

    opencascade-7.3.0-vc14-64.rar

    Open CASCADE Technology(简称Open CASCADE,OCCT)是一个开源的3D建模和CAD/CAM/CAE软件开发平台。这个“opencascade-7.3.0-vc14-64.rar”压缩包包含了OCCT 7.3.0版本的安装程序,特别为使用Visual C++ 2017 64位...

    kubernetes常用命令表

    $ kubectl delete (-f FILENAME | TYPE NAME) [--grace-period=GRACE_PERIOD] [--orphan] [--cascade=false] [--dry-run=bool] ... ``` #### 二十、kubectl edit 编辑服务器上的资源对象。 ##### 20.1 语法: ```...

    haarcascade-russian-plate-number.xml.zip

    标题 "haarcascade-russian-plate-number.xml.zip" 指的是一个OpenCV库中的预训练分类器模型,专门用于检测俄罗斯车辆的车牌号码。这个压缩包包含了一个名为 "haarcascade_russian_plate_number.xml" 的文件,这是一...

    opencv识别车牌haarcascade-licence-plate-rus-16stages.xml

    "haarcascade-licence-plate-rus-16stages.xml" 文件就是这样的一个预训练分类器,专用于识别俄罗斯车牌。 Haar级联分类器是OpenCV中一种基于特征的检测方法,最初由Piotr Viola和John Jones提出。这个XML文件实际...

    haarcascade-lefteye-2splits.xml.zip

    标题 "haarcascade-lefteye-2splits.xml.zip" 提供了我们即将讨论的核心主题:OpenCV中的级联分类器,特别是用于检测左眼的Haar特征级联分类器。这个XML文件是OpenCV库的一部分,用于实现计算机视觉中的对象检测功能...

    haarcascade-frontalface-alt-tree.xml.zip

    标题 "haarcascade-frontalface-alt-tree.xml.zip" 指的是一个OpenCV库中用于面部检测的预训练模型文件的压缩包。OpenCV(开源计算机视觉库)是一个跨平台的计算机视觉和机器学习软件库,它包含了各种用于处理图像和...

    haarcascade-righteye-2splits.xml.zip

    标题中的"haarcascade-righteye-2splits.xml.zip"提到了OpenCV中的一种特征检测算法,即Haar级联分类器。这是一个用于对象检测,尤其是人脸识别中的机器学习模型。Haar级联分类器通过一系列的矩形特征来检测目标,如...

    stable-cascade 使用教程安装使用教程.md

    stable-cascade 使用教程安装使用教程.md stable-cascade 使用教程安装使用教程.md stable-cascade 使用教程安装使用教程.md stable-cascade 使用教程安装使用教程.md stable-cascade 使用教程安装使用教程.md ...

    haarcascade-frontalface-alt.xml.zip

    标题中的"haarcascade-frontalface-alt.xml.zip"是一个压缩包文件,其中包含了OpenCV库的一个面部检测模型。OpenCV(开源计算机视觉库)是一个强大的工具,广泛应用于图像处理和计算机视觉领域。这个模型,"haar...

    libemgucv-windows-x64-2.2.1.1150.zip

    在本文中,我们将深入探讨libemgucv的核心功能、安装过程以及如何在C#环境中进行实际应用。 首先,libemgucv的核心功能包括但不限于人脸检测、特征提取、图像处理和分析等。它利用OpenCV的强大功能,如Haar级联分类...

    haarcascade-eye-tree-eyeglasses.xml.zip

    标题 "haarcascade-eye-tree-eyeglasses.xml.zip" 提供了一个关键线索,这与计算机视觉领域中的对象检测算法有关,特别是OpenCV库中的Haar级联分类器。Haar特征是用于人脸检测和其他特征检测的一种算法,由Piotr ...

    Ajax-Cascade-Ajax-Select.zip

    Ajax-Cascade-Ajax-Select.zip,这是一个现成的html/jquery源代码,演示了如何构建基于ajax的级联选择。,ajax代表异步javascript和xml。它是多种web技术的集合,包括html、css、json、xml和javascript。它用于创建...

    haarcascade-frontalface-default.xml.zip

    标题 "haarcascade-frontalface-default.xml.zip" 暗示了这是一个与计算机视觉和人脸识别相关的资源包。这个压缩文件包含了一个名为 "haarcascade_frontalface_default.xml" 的文件,这是OpenCV库中用于人脸检测的...

    haarcascade-frontalcatface-extended.xml.zip

    标题中的"haarcascade-frontalcatface-extended.xml.zip"是一个OpenCV库中使用的特征级联分类器的压缩文件,专门用于检测猫的正面面部。OpenCV是一个开源计算机视觉库,它包含了大量的图像处理和计算机视觉算法,...

    haarcascade-eye-tree-eyeglasses.xml

    haarcascade_eye_tree_eyeglasses.xml OpenVC haarcascade_frontalcatface.xml haarcascade_frontalcatface_extended.xml haarcascade_frontalface_alt.xml haarcascade_frontalface_alt_tree.xml haarcascade_...

Global site tag (gtag.js) - Google Analytics