实体管理器隐式事务提交

时间:2015-07-29 11:29:41

标签: java jpa transactions persistence entitymanager

让我们考虑以下代码片段:

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,容器管理的实体管理器。

来自javacodegeeks

  

在方法的第二行结束时,项目和员工   实例是管理的。在方法调用结束时,事务   已提交并且人员和员工的托管实例获得   持续存在。要记住的另一件事是交易时   结束了,持久性背景消失了。

我真的无法理解实体管理器如何知道方法已关闭并隐式提交事务...
我在这里错过了什么吗? 我们应该明确提交交易吗?

1 个答案:

答案 0 :(得分:1)

是的,你遗失了一些东西:

您的服务不仅仅是EmployeeServiceImpl的实例,而是包含EmployeeServiceImpl及其中每个公共方法的代理类的实例。当你的方法退出时,包装方法接管并提交事务。如果您调试应用程序并在assignEmployeeToProject()中设置断点,则可以非常轻松地看到堆栈跟踪中发生的情况。