gpt4 book ai didi

java - 将持久化实体保留在事务之外

转载 作者:行者123 更新时间:2023-12-01 16:35:25 24 4
gpt4 key购买 nike

我有一个场景,我试图将复杂数据导入到我的数据库(具有子对象和列表对象的对象,一些用于更新,而另一些用于新插入)。目前,我正在处理的一般流程如下:

void importData(List dataToImport){
Object persistedObject1 = getObjectFromDB(); // data that will be attached to various objects in my import
HashMap map1 = preFillMap1(); // Fills a map with persisted objects from database to be attached to data
HashMap map2 = emptyMap(); // start with an empty map here
try{
for(Object data : dataToImport){
Object dbSavedData = importDataImpl(persistedObject1, map2, map3, data)
map2.put(dbSavedData.getChild().getRecordID(), dbSavedData.getChild())
}
}catch(Exception e){
logger.error("Error in transaction", e);
}
}

@org.springframework.transaction.annotation.Transactional
void importDataImpl(Object persistedObj, HashMap map1, HashMap map2, Object dataToImport){
// simplified import process
dataToImport.setForeignKeyObject1(persistedObj);
dataToImport.setForeignKeyObject2(map1.get(dataToImport.obj2ID));
if(map2.contains(dataToImport.getChild().getRecordID()){
dataToImport.setForeignKeyObject3(map2.get(dataToImport.obj3ID));
}else{
dataToImport.setForeignKeyObject3(repo.findByID(dataToImport.getChild().getRecordID());
}
jpaRepo.save(dataToImport);
}

我在上面遇到的问题是,一旦我在 importDataImpl 中遇到错误,我就会在以后的调用中遇到错误,如下所示:

detached entity passed to persist: com.project.ChildObject; nested exception is org.hibernate.PersistentObjectException: 
detached entity passed to persist: com.project.ChildObject org.springframework.dao.InvalidDataAccessApiUsageException: detached entity passed to persist:com.project.ChildObject

到目前为止,我能够解决这个问题的唯一方法是在错误时重置 map 并重试 importDataImpl 调用。它第二次可以正常工作,但保留映射的目标是减少所需的数据库调用数量。我已经看到了一些关于进行entityManager.contains(obj) 检查的建议,但据我所知,这并不可靠,也不是最优雅的解决方案,因为我仍然需要重置 map 。那时,捕获错误并在那里处理它似乎更干净。

最佳答案

也许你可以尝试entity.merge()。

merge() 会将陈旧状态推送到数据库,并覆盖任何干预更新

关于java - 将持久化实体保留在事务之外,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61959650/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com