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>

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值