如何使用 JavaEE、servlet、jsp、EJB、JSTL 修复将 2 个表与数据库相关的数据持久化
How to fix to persist data relating 2 tables to database using JavaEE, servlet, jsp,EJB, JSTL
我已经编写了添加产品的代码,但无法将数据保存到数据库 tables.To 插入数据 我需要考虑产品 table 和类别 table。
category table 有 id 和 name 字段。产品 table 是我需要插入名称、价格、描述和 category_id 等数据的地方,它是从类别 table.
的 ID 引用的
我认为问题的关键在于类别字段。需要设置product.setCategory(category);
因为它不允许我使用 SetcategoryID 进行设置。
所以,我正在寻求帮助,我在哪里弄错了,或者我应该如何更正 adminservlet 中的以下代码。我已经包含了影响这件事的代码。
更新: 整晚尝试不同的东西后解决了这个问题。仍然欢迎您的建议和知识,因为您的代码可能比我的更有效,因为我是 Java 平台的初学者。还有一件事需要解决,就是在数据插入成功后重定向或转发响应
它不工作。
AdminServlet
else if (userPath.equals("/admin/addProduct")){
String name = request.getParameter("name");
Double price = Double.parseDouble(request.getParameter("price")) ;
String description = request.getParameter("description");
//Integer category_id = Integer.parseInt(request.getParameter("category_id")) ;
Integer category_id = Integer.parseInt(request.getParameter("category_id")) ;
//Category category = new Category(request.getParameter("category"););
//String category = category(request.getParameter("category"));
boolean validationErrorFlag;
validationErrorFlag = validator.validateForm(name, request);
// if validation error found, return to same
if (validationErrorFlag == true) {
request.setAttribute("validationErrorFlag", validationErrorFlag);
}
else {
try{
request.setAttribute("name" , name);
request.setAttribute("price" , price);
request.setAttribute("description" , description);
// get selected category
//Category category = categoryFacade.find(Integer.parseInt(categoryId));
request.setAttribute("category" , category_id);
productManager.addProduct(name, price, description, category);
response.sendRedirect("/admin/showProduct");
}
catch(Exception ex){
ex.toString();
}
}
}
ProductManager.java
public Product addProduct(String name, Double price, String description, Category category) {
Product product = new Product();
product.setName(name);
//product.setCatId();
product.setCategory(category);
product.setPrice(price);
product.setDescription(description);
em.persist(product);
return product;
}
addProduct.jsp
<h1>Add Product item: </h1>
<form id ="addProductForm" action="<c:url value='/admin/addProduct'/>" method="post">
<c:if test="${!empty validationErrorFlag}">
<p><fmt:message key="validationErrorMessage"/> </p>
<c:if test="${!empty nameError}"><p><fmt:message key="nameError"/></p></c:if>
<c:if test="${!empty categoryError}"><p><fmt:message key="categoryError"/></p></c:if>
<c:if test="${!empty priceError}"><p><fmt:message key="priceError"/></p></c:if>
<c:if test="${!empty descriptionError}"><p><fmt:message key="descriptionError"/></p></c:if>
</c:if>
<p><strong>Product Name:</strong></p>
<input class ="form-control" type="text" name="name" value="${param.name}">
<p><strong>Product Category:</strong></p>
<select id="category" name="category" class="form-control">
<option value="">Select</option>
<c:forEach var="category" items="${categories}" varStatus="iter">
<option value="${category.id}">${category.name}</option>
</c:forEach>
</select>
<p><strong>Product Price:</strong></p>
<input class ="form-control col-md-6" type="text" name="price">
<p><strong>Product details:</strong></p>
<textarea class ="form-control" type="textarea" name="description" rows="4">
</textarea>
<br>
<p><input class ="btn-success" type="submit" value="Submit"></p>
</form>
category.java实体
@OneToMany(cascade = CascadeType.ALL, mappedBy = "category")
private Collection<Product> productCollection;
Product.java实体
@JoinColumn(name = "category_id", referencedColumnName = "id")
@ManyToOne(optional = false)
private Category category;
/*
@OneToOne
private Category categoryId;
*/
@OneToMany(cascade = CascadeType.ALL, mappedBy = "product")
private Collection<OrderedProduct> orderedProductCollection;
解决了我自己。如果将来有人需要,这里是解决方案。
public Product addProduct(String name, Double price, String description, Integer category_id) {
Product product = new Product();
product.setName(name);
//product.setCatId();
Category category = new Category(category_id);
product.setCategory(category);
product.setPrice(price);
product.setDescription(description);
//em.persist(category);
em.persist(product);
return product;
}
我已经编写了添加产品的代码,但无法将数据保存到数据库 tables.To 插入数据 我需要考虑产品 table 和类别 table。 category table 有 id 和 name 字段。产品 table 是我需要插入名称、价格、描述和 category_id 等数据的地方,它是从类别 table.
的 ID 引用的我认为问题的关键在于类别字段。需要设置product.setCategory(category); 因为它不允许我使用 SetcategoryID 进行设置。
所以,我正在寻求帮助,我在哪里弄错了,或者我应该如何更正 adminservlet 中的以下代码。我已经包含了影响这件事的代码。
更新: 整晚尝试不同的东西后解决了这个问题。仍然欢迎您的建议和知识,因为您的代码可能比我的更有效,因为我是 Java 平台的初学者。还有一件事需要解决,就是在数据插入成功后重定向或转发响应 它不工作。
AdminServlet
else if (userPath.equals("/admin/addProduct")){
String name = request.getParameter("name");
Double price = Double.parseDouble(request.getParameter("price")) ;
String description = request.getParameter("description");
//Integer category_id = Integer.parseInt(request.getParameter("category_id")) ;
Integer category_id = Integer.parseInt(request.getParameter("category_id")) ;
//Category category = new Category(request.getParameter("category"););
//String category = category(request.getParameter("category"));
boolean validationErrorFlag;
validationErrorFlag = validator.validateForm(name, request);
// if validation error found, return to same
if (validationErrorFlag == true) {
request.setAttribute("validationErrorFlag", validationErrorFlag);
}
else {
try{
request.setAttribute("name" , name);
request.setAttribute("price" , price);
request.setAttribute("description" , description);
// get selected category
//Category category = categoryFacade.find(Integer.parseInt(categoryId));
request.setAttribute("category" , category_id);
productManager.addProduct(name, price, description, category);
response.sendRedirect("/admin/showProduct");
}
catch(Exception ex){
ex.toString();
}
}
}
ProductManager.java
public Product addProduct(String name, Double price, String description, Category category) {
Product product = new Product();
product.setName(name);
//product.setCatId();
product.setCategory(category);
product.setPrice(price);
product.setDescription(description);
em.persist(product);
return product;
}
addProduct.jsp
<h1>Add Product item: </h1>
<form id ="addProductForm" action="<c:url value='/admin/addProduct'/>" method="post">
<c:if test="${!empty validationErrorFlag}">
<p><fmt:message key="validationErrorMessage"/> </p>
<c:if test="${!empty nameError}"><p><fmt:message key="nameError"/></p></c:if>
<c:if test="${!empty categoryError}"><p><fmt:message key="categoryError"/></p></c:if>
<c:if test="${!empty priceError}"><p><fmt:message key="priceError"/></p></c:if>
<c:if test="${!empty descriptionError}"><p><fmt:message key="descriptionError"/></p></c:if>
</c:if>
<p><strong>Product Name:</strong></p>
<input class ="form-control" type="text" name="name" value="${param.name}">
<p><strong>Product Category:</strong></p>
<select id="category" name="category" class="form-control">
<option value="">Select</option>
<c:forEach var="category" items="${categories}" varStatus="iter">
<option value="${category.id}">${category.name}</option>
</c:forEach>
</select>
<p><strong>Product Price:</strong></p>
<input class ="form-control col-md-6" type="text" name="price">
<p><strong>Product details:</strong></p>
<textarea class ="form-control" type="textarea" name="description" rows="4">
</textarea>
<br>
<p><input class ="btn-success" type="submit" value="Submit"></p>
</form>
category.java实体
@OneToMany(cascade = CascadeType.ALL, mappedBy = "category")
private Collection<Product> productCollection;
Product.java实体
@JoinColumn(name = "category_id", referencedColumnName = "id")
@ManyToOne(optional = false)
private Category category;
/*
@OneToOne
private Category categoryId;
*/
@OneToMany(cascade = CascadeType.ALL, mappedBy = "product")
private Collection<OrderedProduct> orderedProductCollection;
解决了我自己。如果将来有人需要,这里是解决方案。
public Product addProduct(String name, Double price, String description, Integer category_id) {
Product product = new Product();
product.setName(name);
//product.setCatId();
Category category = new Category(category_id);
product.setCategory(category);
product.setPrice(price);
product.setDescription(description);
//em.persist(category);
em.persist(product);
return product;
}