让我们考虑以下代码片段:
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);
}
}
请注意,此示例引用了Transaction Scoped,容器管理的实体管理器。
在方法的第二行结束时,项目和员工 实例是管理的。在方法调用结束时,事务 已提交并且人员和员工的托管实例获得 持续存在。要记住的另一件事是交易时 结束了,持久性背景消失了。
我真的无法理解实体管理器如何知道方法已关闭并隐式提交事务...
我在这里错过了什么吗?
我们应该明确提交交易吗?
答案 0 :(得分:1)
是的,你遗失了一些东西:
您的服务不仅仅是EmployeeServiceImpl
的实例,而是包含EmployeeServiceImpl
及其中每个公共方法的代理类的实例。当你的方法退出时,包装方法接管并提交事务。如果您调试应用程序并在assignEmployeeToProject()
中设置断点,则可以非常轻松地看到堆栈跟踪中发生的情况。