Java 如何更新分离的实体?
我想对Java 如何更新分离的实体?,java,spring,entity-framework,hibernate,transactions,Java,Spring,Entity Framework,Hibernate,Transactions,我想对@实体执行多个更新。但根据一些估计,我必须在这两者之间执行长时间运行的任务。任务本身基于该实体的属性。因此,我首先必须获取实体,合并一些内容,运行长任务,然后再次合并 这将跨越数据库事务,这可能不正确: @Transactional public void update(DTO dto) { entity = findOne(dto.id); updateEntityFieldsFromDTO(entity, dto); if (entity.hasTaskCon
@实体执行多个更新。但根据一些估计,我必须在这两者之间执行长时间运行的任务。任务本身基于该实体的属性。因此,我首先必须获取实体,合并一些内容,运行长任务,然后再次合并
这将跨越数据库事务,这可能不正确:
@Transactional
public void update(DTO dto) {
entity = findOne(dto.id);
updateEntityFieldsFromDTO(entity, dto);
if (entity.hasTaskCondition) {
result = runLongTask(entity.property); //spanning the tx
mergeResultIntoEntity(entity, result);
}
}
问题:runlongstask()
将阻止事务,并使数据库连接保持打开状态,可能会持续很长时间,而不会在数据库上进行交互
因此,我想创建单个@事务性方法,并在这些方法之外运行任务:
//wrapper method without a transaction
public void updateFacade(DTO dto) {
entity = service.update(dto.id);
if (entity.hasTaskCondition) {
//running outside the transaction
result = runLongTask(entity.property);
service.mergeResultIntoEntity(entity.id, result);
}
}
那么我的事务方法如下所示:
@Transactional
public Entity update(DTO dto) {
//first select the entity
entity = findOne(dto.id);
//then merge the content
updateEntityFieldsFromDTO(entity, dto);
return entity;
}
@Transactional
public Entity mergeResultIntoEntity(id, result) {
//again select the entity
entity = findOne(dto.id);
//now merge result into entity within tx
return entity;
}
问题:始终将实体.id
传递给@Transactional
方法,然后在这些tx方法中再次从db中获取对象是否正确
我认为我无法从updateFacade将实体直接传递到@Transactional
方法中,因为实体是分离的
。正确吗?我认为getHibernateTemplate()。合并(实体)
就是您想要的。请参阅merge()
是否需要在事务内部运行?是的,但是事务可以与findOne(dto.id)
的事务不同。我认为getHibernateTemplate()。合并(实体)
就是您想要的。请参阅merge()
是否需要在事务内部运行?是的,但事务可以与findOne(dto.id)
的事务不同。