Cascade="all-delete-orphan"およびjava.util.ConcurrentModificationExceptionの問題


次の2つの問題を解決します.
 
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>