我使用hibernate orphanRemoval来管理子记录的删除。例如,有一个带有子实体Ledger的实体Fp。
@OneToMany(fetch=FetchType.LAZY,cascade = CascadeType.ALL, orphanRemoval = true, mappedBy="fp")
public Set<Ledger> getLedgers() {
return this.ledgers;
}通常,Fp将获得一组经过编辑的分类账,如果不再需要记录,则将其从集合中删除,并在Fp持久化时将其从数据库中删除。
还有另一个“副作用”,虽然这种方法,当我想添加新的记录,而不一定要麻烦以前的数据。删除所有以前的数据。
我创建了一组新的分类账,并将其添加到Fp中,然后保存Fp。
LinkedHashSet<Ledger> genLedgerAccSet = new LinkedHashSet<>();
Ledger expenseLedger = new Ledger();
expenseLedger.setChartaccountByAccCode(accCode);
expenseLedger.setCreateDate(selectedFp.getYearEnd());
expenseLedger.setCurrency(defaultCurr);
expenseLedger.setTxnDate(new Date());
expenseLedger.setFp(fp);
expenseLedger.setDebitAmt(0);
expenseLedger.setCreditAmt(expBalDiff);
genLedgerAccSet.add(expenseLedger);
Ledger expenseLedger2 = new Ledger();
expenseLedger2.setChartaccountByAccCode(accCode2);
expenseLedger2.setCreateDate(selectedFp.getYearEnd());
expenseLedger2.setCurrency(defaultCurr);
expenseLedger2.setTxnDate(new Date());
expenseLedger2.setFp(fp);
expenseLedger2.setDebitAmt(0);
expenseLedger2.setCreditAmt(expBalDiff);
genLedgerAccSet.add(expenseLedger2);
fp.setLedgers(genLedgerAccSet);
financialperiodService.update(fp);
//the service implements a method from DAO to merge
final T savedEntity = (T) sessionFactory.getCurrentSession().merge(entity);我猜想,即使我还没有取下来,新的一套却取代了旧的一套。我正在使用Hibernate 4.2.4最后
是否有更好的方法在Fp的子记录中添加更多的数据而不删除所有以前的记录?
发布于 2018-01-23 19:41:15
您正在覆盖Fp对象中的分类账,这就是为什么要删除子对象的原因。您需要从Fp对象中获取分类账,然后保存新的分类帐。
查阅分类账:
Set<Ledger> genLedgerAccSet = fp.getLedgers();创建新的分类账:
Ledger expenseLedger = new Ledger();
expenseLedger.setChartaccountByAccCode(accCode);
expenseLedger.setCreateDate(selectedFp.getYearEnd());
expenseLedger.setCurrency(defaultCurr);
expenseLedger.setTxnDate(new Date());
expenseLedger.setFp(fp);
expenseLedger.setDebitAmt(0);
expenseLedger.setCreditAmt(expBalDiff);
genLedgerAccSet.add(expenseLedger);
expenseLedgerService.save(expenseLedger);我想expenseLedgerService是你保存分类账的地方。
https://stackoverflow.com/questions/48397830
复制相似问题