1

我有以下方法:

@Transactional
public void onEmailMessage() {

    this.departmentService.removeUserFromDepartments(user, depsids);
    this.departmentService.getDepartmentUsers(user.id); 
}

当我调用这个方法时,奇怪的是第一行:

  this.departmentService.removeUserFromDepartments(user, depsids);

被调用,但数据库根本没有改变,用户仍然连接到部门(多对多关系)

之后的方法:

   this.departmentService.getDepartmentUsers(user.id); 

被调用并返回连接到部门的用户,包括从第 1 行删除的用户。

当方法返回时 - 如果我检查数据库,我删除的用户实际上已从表中删除!

我可以让查询返回实际更新的值吗?

4

3 回答 3

2

这没有什么奇怪的。您正在同一事务中执行两个不同的查询。持久性上下文已更新,但尚未提交事务,并且在第一行完成后您无法看到您的更改。事务是一组语句(在这种情况下 - 由您的这两种方法创建的语句),它们在commit被调用后被执行。当整个 (onEmailMessage) 方法完成它的工作时,事务被提交并且您正在看到更改。

解决方案是:

将它们作为两个单独的事务。例如:

@Transactional
public void removeUser(...) {
    someInstance.departmentService.removeUserFromDepartments(user, depsids);
}

和:

@Transactional
public List<?> getUsers(...) {
    return someInstance.departmentService.getDepartmentUsers(user.id);
}

然后最高级别是onEmailMessage()方法,它必须是非事务性的并且在单独的类中,然后是上面的这两种方法。在这个级别调用他们两个,它会工作。

于 2013-08-14T13:02:14.360 回答
0

您已将其标记为TransactionalDB在执行所有查询后进行更改。要么提交所有操作,要么不提交。

于 2013-08-14T11:58:03.793 回答
0

该事务尚未提交,因此不一定会将更改写入数据库。

你可以试试打电话

entityManager.flush();

after removeUserFromDepartments()but beforegetDepartmentUsers()强制在提交之前写入数据库更改。

于 2013-08-14T12:00:45.760 回答