Cascade="all-delete-orphan"およびjava.util.ConcurrentModificationExceptionの問題
次の2つの問題を解決します.
1.Hibernate cascade="all-delete-orphan"アプリケーション;
2.Collection or List等の集合を用いる場合にremove操作によるjavaを反復する.util.ConcurrentModificationExceptionの問題
Transaction-TransFunctionは一対多の関係である:hbm.xmlプロファイルは次のとおりです.
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>