[JavaEE:对数据库进行更改后,来自实体的集合未更新

问题描述 投票:0回答:1

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

我有一个“公司”实体,并且此实体具有“雇员”实体的集合。

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

但是,如果我使用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(),则会获取更新的员工列表。

java glassfish ejb entitymanager
1个回答
0
投票

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

public static final FlushModeType COMMIT

在事务提交时发生刷新。提供程序可以在其他时间刷新,但不是必需的。

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

public static final FlushModeType AUTO

(默认)在执行查询时发生冲洗。

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

flush()

将持久性上下文同步到基础数据库。

© www.soinside.com 2019 - 2024. All rights reserved.