我正在使用数据库中的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(),则会获取更新的员工列表。
我怀疑您的EntityManager刷新模式类型设置为COMMIT而不是AUTO。当刷新模式类型设置为COMMIT时,在事务提交时执行将持久性上下文同步到基础数据库的刷新动作。
public static final FlushModeType COMMIT
在事务提交时发生刷新。提供程序可以在其他时间刷新,但不是必需的。
如果您希望在执行查询时与基础数据库进行同步,请将刷新模式类型设置为AUTO
public static final FlushModeType AUTO
(默认)在执行查询时发生冲洗。
或者,您可以直接在查询后直接调用flush()
操作以明确要求与基础数据库同步。
flush()
将持久性上下文同步到基础数据库。