【发布时间】:2020-12-14 02:41:52
【问题描述】:
我正在使用 jpa 实体侦听器类 where 和 spring 数据存储库。在@PreMethod 更新中,如果我使用@Transactional(propagation = Propagation.REQUIRES_NEW),我将直接从数据库中获取数据。如果我在私有方法(getOldEmployee) 上使用相同的 事务注释 called inside @PreMethod 我没有从数据库中获取数据,而是使用相同的最新会话数据不确定为什么会发生这种行为
实体类
@Entity
@Table(name = "Employee")
@EntityListeners({EmployeeListener.class)
public class Employee extends AuditEntity implements Serializable {
}
监听类
@Component
public class EmployeeListner{
@Autowired
EmployeeRepository employeeRepository;
@PreUpdate
@Transactional(propagation = Propagation.REQUIRES_NEW) //if use here I get the employee database value before updating the database
public void preUpdateEvent(Employee employee) {
Employee employee=getOldEmployee(employee);
}
private Employee getOldEmployee(Employee employee) { //if inspite of using @Transactional(propagation = Propagation.REQUIRES_NEW) in @PreMethod if use here I am not getting the database value rather getting latest value
Optional<Employee> getOldEmployeeOptional =employeeRepository.findById(employee.getId());
getOldEmployeeOptional
}
}
【问题讨论】:
-
@Transactional与 Spring AOP 将不起作用。它仅适用于公共方法和外部调用的方法。这是因为代理被用于应用 AOP。 -
@M.Deinum 我尝试将私有方法设为公开,但在 getOldEmployee() 方法上应用 @Transactional(propagation = Propagation.REQUIRES_NEW) 调用employeeRepository.findById(employee.getId( ));只给出不是从数据库传递的最新值
-
@M.Deinum 但是如果我在 preUpdateEvent 方法上应用@Transactional(propagation = Propagation.REQUIRES_NEW) 它可以调用employeeRepository.findById(employee.getId());正在从数据库中给我价值
-
如前所述,因为它是内部方法调用,所以也不起作用。
标签: java spring spring-boot spring-data-jpa spring-transactions