首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当我持久化新数据时,孤儿删除正在删除所有以前的记录。

当我持久化新数据时,孤儿删除正在删除所有以前的记录。
EN

Stack Overflow用户
提问于 2018-01-23 09:07:05
回答 1查看 247关注 0票数 0

我使用hibernate orphanRemoval来管理子记录的删除。例如,有一个带有子实体Ledger的实体Fp。

代码语言:javascript
复制
    @OneToMany(fetch=FetchType.LAZY,cascade = CascadeType.ALL, orphanRemoval = true, mappedBy="fp")
    public Set<Ledger> getLedgers() {
        return this.ledgers;
    }

通常,Fp将获得一组经过编辑的分类账,如果不再需要记录,则将其从集合中删除,并在Fp持久化时将其从数据库中删除。

还有另一个“副作用”,虽然这种方法,当我想添加新的记录,而不一定要麻烦以前的数据。删除所有以前的数据。

我创建了一组新的分类账,并将其添加到Fp中,然后保存Fp

代码语言:javascript
复制
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的子记录中添加更多的数据而不删除所有以前的记录?

EN

回答 1

Stack Overflow用户

发布于 2018-01-23 19:41:15

您正在覆盖Fp对象中的分类账,这就是为什么要删除子对象的原因。您需要从Fp对象中获取分类账,然后保存新的分类帐。

查阅分类账:

代码语言:javascript
复制
Set<Ledger> genLedgerAccSet = fp.getLedgers();

创建新的分类账:

代码语言:javascript
复制
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是你保存分类账的地方。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48397830

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档