【问题标题】:Collection from Entity not updating after change on database实体集合在数据库更改后未更新
【发布时间】:2020-05-23 14:43:30
【问题描述】:

我正在使用数据库中的 JPA 实体,并尝试通过 EntityManager 在数据库中创建、修改或删除寄存器。

我有一个“公司”实体,这个实体有一个“员工”实体的集合。

当我修改、创建或删除 Employee 表中的某些寄存器时,不会更新来自 Company 实体的“Employee”集合,只有当我停止并再次运行项目时(我正在使用 glassFish 服务器)

但是,如果我使用 Employee 实体外观使用 findAll() 方法直接打印整个员工列表,则显示的员工是更新的。

代码如下:


public class test extends HttpServlet {

    /**
     * Processes requests for both HTTP <code>GET</code> and <code>POST</code>
     * methods.
     *
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */

    @EJB
    CompanyFacade companyDB;

    @EJB 
    EmployeeFacade employeeDB;

    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        try (PrintWriter out = response.getWriter()) {
            /* TODO output your page here. You may use following sample code. */            
            Company company = companyDB.find("Z-5849729");
            //CREATE
            if(request.getParameter("create")!=null){
                Employee employee = new Employee(3);
                employee.setBirthdate("05/06/1998");
                employee.setCompanyrfc(company);
                employee.setSalary(1600);
                employee.setSector("Client Support");
                employee.setName("Alfonso Guerrero");
                employeeDB.create(employee);
            }


            //REMOVE
            if(request.getParameter("remove")!=null){
                Employee employee = employeeDB.find(3);
                employeeDB.remove(employee);
            }

            //EDIT
            if (request.getParameter("edit")!=null){
                Employee employee = employeeDB.find(3);
                employee.setName("Alfonso Modified");
                employeeDB.edit(employee);
            }

            out.println("<!DOCTYPE html>");
            out.println("<html>");
            out.println("<head>");
            out.println("<title>Servlet test</title>");            
            out.println("</head>");
            out.println("<body>");

            out.println(company.getCompanyrfc()+" |" + company.getName());
            Address address =  company.getZipcode();
            List<Employee> employees = (List<Employee>) company.getEmployeeCollection();
            for (Employee employee : employees){
                System.out.println(employee.getName());
                out.println(employee.getName());
            }
            List<Items> items = ( List<Items>) company.getItemsCollection();
            for (Items item : items){
                out.println(item.getItemname());
            }

            List<Employee> employeeList = employeeDB.findAll();
            for (Employee employee : employeeList){
                out.println("<p>"+employee.getName()+"</p>");
            }

            out.println(" |" + address.getCountry() + " " + address.getAdminname());
            out.println("<h1>Servlet test at " + request.getContextPath() + "</h1>");
            out.println("</body>");
            out.println("</html>");
        }
    }


}

当我使用公司实体中的 company.getEmployeeCollection() 时,我得到了未更新的员工列表。

如果我使用 Employee Entity Facade 中的 employeeDB.findAll(),我会更新员工列表。

【问题讨论】:

  • 可能与刷新entitymanager有关。完成上述操作后拨打entityManager.flush()查看。

标签: jpa


【解决方案1】:

我怀疑您的 EntityManager 刷新模式类型设置为 COMMIT 而不是 AUTO。 当刷新模式类型设置为 COMMIT 时,将持久性上下文同步到底层数据库的刷新操作发生在事务提交时。

public static final FlushModeType COMMIT

在事务提交时进行刷新。提供程序可能会在其他时间刷新,但不是必须的。

如果您希望在执行查询时同步到底层数据库,请将刷新模式类型设置为 AUTO

public static final FlushModeType AUTO

(默认)在查询执行时进行刷新。

或者,您可以直接调用flush() 操作来明确要求在查询后立即与底层数据库同步。

flush()

将持久化上下文同步到底层数据库。

【讨论】:

  • 感谢您的回复,我在CompanyFacade 中添加了flush 操作。现在在'employeeDB.create(employee);'之后,employeeDB.edit(employee);和 'employeeDB.remove(employee);'我正在使用“companyDB.flush()”,但它仍然没有更新。我做错了什么?
  • 奇怪...继续查看事务持久性上下文,看看调用entityManager.refresh(yourEntity)(刷新后)是否有帮助
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-11-13
  • 2015-09-21
  • 2012-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多