我想在@Entity
上执行多项更新。但基于一些评价,我必须在两者之间执行长时间运行的任务。任务本身基于该实体的属性。因此,我首先必须获取实体,合并一些内容,运行长任务,然后再次合并。
这将跨越数据库事务,这可能不正确:
@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);
}
}
问题:runLongTask()
将阻止事务并保持数据库连接打开很长一段时间,而不会在数据库上进行交互。
因此,我想创建单个@Transactional
方法,并运行那些tx的任务:
//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;
}
问题:始终将entity.id
传递给@Transactional
方法,然后再从db 中获取对象是否正确? tx方法?
我认为我无法将实体直接传递给updateFacade的@Transactional
方法,因为实体是detached
。正确的吗?