如何使用JSTL、JPA、EJB、JSP、Servlet更新和删除JavaEE中的记录

如何使用JSTL、JPA、EJB、JSP、Servlet更新和删除JavaEE中的记录,jsp,jakarta-ee,servlets,jpa,ejb,Jsp,Jakarta Ee,Servlets,Jpa,Ejb,我已设法将数据持久保存到数据库中,但无法更新数据和删除数据。我想我走错了路,或者有些事情需要解决。我自己也在学习JavaEE,学习来自Netbeans的JavaEE电子商务教程。我已经学习了所有课程,现在向这个应用程序添加了一些功能,使其成为现实世界的应用程序,因为这个示例课程缺少很多东西,但直到现在,我才能够将数据持久保存到db。 在这里,我想知道如何修复它,以及如何更好地使其工作 这是带有删除和更新按钮的阅读部分。它能够显示来自MySQL的数据列表 <c:if test="${!emp

我已设法将数据持久保存到数据库中,但无法更新数据和删除数据。我想我走错了路,或者有些事情需要解决。我自己也在学习JavaEE,学习来自Netbeans的JavaEE电子商务教程。我已经学习了所有课程,现在向这个应用程序添加了一些功能,使其成为现实世界的应用程序,因为这个示例课程缺少很多东西,但直到现在,我才能够将数据持久保存到db。 在这里,我想知道如何修复它,以及如何更好地使其工作

这是带有删除和更新按钮的阅读部分。它能够显示来自MySQL的数据列表

<c:if test="${!empty categoryList}">

                    <h2>Category List</h2>
                    <table class="table">
                        <tr>
                            <th>Category Id:</th>
                            <th>Category Name:</th>
                            <th>Edit</th>
                            <th>Delete</th>
                        </tr>
                        <c:forEach var="category" items="${categoryList}" varStatus="iter">
                            <tr>
                            <td>${category.id}</td>
                            <td>${category.name}</td>
                            <td><a class="btn btn-danger" alt="Update" href='updateCategory.jsp?id=<c:out value="${category.id}"/>'><i class="fa fa-cut"></i></a></td>
                            <td><a class="btn btn-danger" alt="Delete" href='deleteCategory.jsp?action=delete&id=<c:out value="${category.id}"/>'><i class="fa fa-cut"></i></a></td>
                            </tr>
                        </c:forEach>
                    </table>
            </c:if>
从CategoryManager.java更新和删除部件

public Category updateCategory(String name) {
        //public Category updateCategory(String name, int category_id) {
            Category category = new Category();

            category.setName(name);
            //category.setId(category_id);
            em.merge(category); 
            return category;


        }
        public Category deleteCategory(int id){
            Category category = new Category();
            category.setId(id);
            em.remove(category); 
            return category;
        }

没有用于调用删除的代码,因此请确保实际调用了CategoryManager的deleteCategory

但除此之外,守则还应包括:

public Category deleteCategory(int id){
    Category category = em.find(Category.clas,id);
    em.remove(category); 
    return category;
}
对于更新,您需要知道要更新的类别的id

public Category updateCategory(int id, String name) {
    Category category = em.find(Category.class,id);
    category.setName(name);
    return category;
}

这两个方法都必须在事务上下文中调用,但如果您使用Java EE,它会得到处理(如果不是,您需要调用
em.getTransaction().begin()
em.getTransaction().commit()

实际上代码是正确的,但正如我之前猜测的那样,在我的AdminServlet中缺少的是一件小事。 实际上,url模式丢失了

urlPatterns = {
                            "/admin/",
                            "/admin/viewOrders",
                            "/admin/viewCustomers",
                            "/admin/customerRecord",
                            //"/admin/customerOrder",
                            "/admin/orderRecord",
                            "/admin/logout",
                            "/admin/showProduct",
                            "/admin/showCategory",
                            "/admin/addCategory",
                            "/admin/addCategory.jsp",
                            "/admin/updateCategory",
                            "/admin/addProduct",
                            "/admin/addProduct.jsp",
                            "/admin/deleteProduct.jsp",
                            "/admin/deleteProduct"

                            })
尽管上面提到了categoryManager的另一种方式,但它也可以工作

public Category updateCategory(Category category, String name){

        category.setName(name);
        em.merge(category); 

        return category;
    }

您已经提到id是一个参数
updateCategory.jsp?id=
,但在方法中使用
category\u id
作为参数,如
request.getParameter(“category\u id”)在AdminServletya中,我在id部分出错。我认为对于更新部分,我们需要em.merge(category)。你忘了还是没有必要?我没有,在当前代码中没有必要。该类别是由em.find获得的,因此em已经知道它。如果将修改后的类别作为输入参数传递给该方法而不是其id,则可以使用merge。我注意到一件事。我已经有category=categoryFacade.find(Integer.parseInt(category_id));在我的servlet中,为什么我们需要Category=em.find(Category.class,id);在CategoryManager中。我认为这是多余的。我错了吗@ZielaI没有检查您的servlet代码,只是检查了管理器。只要servlet和管理器使用相同的实体managerok,就可以使用它。但我试过你的代码,但不起作用。即使用你的方式也不会更新。我认为问题在另一部分,请检查我哪里弄错了。我目前正在测试更新部分。
urlPatterns = {
                            "/admin/",
                            "/admin/viewOrders",
                            "/admin/viewCustomers",
                            "/admin/customerRecord",
                            //"/admin/customerOrder",
                            "/admin/orderRecord",
                            "/admin/logout",
                            "/admin/showProduct",
                            "/admin/showCategory",
                            "/admin/addCategory",
                            "/admin/addCategory.jsp",
                            "/admin/updateCategory",
                            "/admin/addProduct",
                            "/admin/addProduct.jsp",
                            "/admin/deleteProduct.jsp",
                            "/admin/deleteProduct"

                            })
public Category updateCategory(Category category, String name){

        category.setName(name);
        em.merge(category); 

        return category;
    }