实体管理器隐式事务提交
entity manager implicit transaction commit
让我们考虑以下代码片段:
public class EmployeeServiceImpl implements EmployeeService
{
@PersistenceContext(unitName="EmployeeService")
EntityManager em;
public void assignEmployeeToProject(int empId, int projectId)
{
Project project = em.find(Project.class, projectId);
Employee employee = em.find(Employee.class, empId);
project.getEmployees().add(employee);
employee.getProjects().add(project);
}
}
请注意,此示例指的是事务范围、容器管理的实体管理器。
来自 javacodegeeks:
By the end of 2nd line in the method both project and employee
instance are managed. At the end of the method call, the transaction
is committed and the managed instances of person and employee get
persisted. Another thing to keep in mind is that when the transaction
is over, the Persistence Context goes away.
我真的无法理解实体管理器如何知道方法已关闭并隐式提交事务...
我在这里错过了什么吗?
我们应该明确提交交易吗?
是的,你遗漏了一些东西:
您的服务不仅仅是 EmployeeServiceImpl
的一个实例,而是一个代理 class 的实例,它包装了 EmployeeServiceImpl
和其中的每个 public 方法。当您的方法退出时,包装方法接管并提交事务。如果您调试应用程序并在 assignEmployeeToProject()
中设置断点,您可以很容易地看到堆栈跟踪中发生了什么。
让我们考虑以下代码片段:
public class EmployeeServiceImpl implements EmployeeService
{
@PersistenceContext(unitName="EmployeeService")
EntityManager em;
public void assignEmployeeToProject(int empId, int projectId)
{
Project project = em.find(Project.class, projectId);
Employee employee = em.find(Employee.class, empId);
project.getEmployees().add(employee);
employee.getProjects().add(project);
}
}
请注意,此示例指的是事务范围、容器管理的实体管理器。
来自 javacodegeeks:
By the end of 2nd line in the method both project and employee instance are managed. At the end of the method call, the transaction is committed and the managed instances of person and employee get persisted. Another thing to keep in mind is that when the transaction is over, the Persistence Context goes away.
我真的无法理解实体管理器如何知道方法已关闭并隐式提交事务...
我在这里错过了什么吗?
我们应该明确提交交易吗?
是的,你遗漏了一些东西:
您的服务不仅仅是 EmployeeServiceImpl
的一个实例,而是一个代理 class 的实例,它包装了 EmployeeServiceImpl
和其中的每个 public 方法。当您的方法退出时,包装方法接管并提交事务。如果您调试应用程序并在 assignEmployeeToProject()
中设置断点,您可以很容易地看到堆栈跟踪中发生了什么。