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)
的事务不同。