![](/img/trans.png)
[英]What is the difference between em.remove(st) and em.remove(em.contains(st) ? st : em.merge(st));
[英]JPA is not deleting an object in my database even though I called em.remove()
我是開發Java EE和JSF Web應用程序的新手。 單擊按鈕后,無法從數據庫中刪除對象。
所以我在做的是單擊JSF頁面上的一個按鈕
<h:commandButton value="Remove" action="#{productManagementBean.removeProd(product.id)}"/>
這將在我的ProductManagementBean中調用一個方法removeProd(Integer);
@Named(value = "productManagementBean")
@RequestScoped
public class ProductManagementBean implements Serializable {
@EJB
private OperationsBeanLocal operationsBean;
@Inject
CurrentUserBean currentUser;
public ProductManagementBean() {
}
public String getQuery() {
String Query = FacesContext.getCurrentInstance().getExternalContext()
.getRequestParameterMap().get("query");
return Query;
}
public void checkIfQueryExists() throws IOException {
if (operationsBean.checkIfQueryExists(getQuery()) == 0) {
FacesContext.getCurrentInstance().getExternalContext().redirect("error.xhtml");
}
}
public List<Products> getProducts() {
return operationsBean.getAllProducts();
}
public Products getProduct() {
return operationsBean.getProduct(getQuery());
}
public Products getProductById(String id) {
return operationsBean.getProductById(Integer.parseInt(id));
}
public String getProductByName(String name) {
String returnString = "";
Products p = operationsBean.getProductByName(name);
if (p != null) {
String temp = p.getName();
temp = temp.replaceAll(" ", "+");
returnString = "product.xhtml?query=" + temp;
} else {
returnString = "error";
}
return returnString;
}
public void removeProd(Integer id) {
operationsBean.removeProd(id);
}
}
該方法將在我的operationBean中調用一個方法
@Stateless
public class OperationsBean implements OperationsBeanLocal {
@PersistenceContext(unitName = "My_Project-ejbPU")
private EntityManager em;
@Override
public List<Products> getAllProducts() {
return em.createQuery("SELECT p FROM Products p").getResultList();
}
@Override
public int checkIfQueryExists(String query) {
List<Products> products = em.createQuery("SELECT p FROM Products p WHERE p.description = :description")
.setParameter("description", query)
.getResultList();
return products.size();
}
@Override
public Products getProduct(String query) {
// Products product = (Products) em.createQuery("SELECT p FROM Products p WHERE p.name = :name")
// .setParameter("name", query)
// .getSingleResult();
Products p = null;
List<Products> products = em.createQuery("SELECT p FROM Products p WHERE p.name = :name")
.setParameter("name", query)
.getResultList();
if (!products.isEmpty()) {
p = products.get(0);
}
return p;
}
@Override
public Products getProductById(Integer id) {
Products product = (Products) em.createQuery("SELECT p FROM Products p WHERE p.id = :id")
.setParameter("id", id)
.getSingleResult();
return product;
}
@Override
public Products getProductByName(String name) {
Products product = (Products) em.createQuery("SELECT p FROM Products p WHERE p.name = :name")
.setParameter("name", name)
.getSingleResult();
return product;
}
@Override
public void removeProd(Integer id) {
List<Products> products = em.createQuery("SELECT p FROM Products p WHERE p.id = :id")
.setParameter("id", id)
.getResultList();
if(!products.isEmpty()) {
delete(products.get(0));
}
}
public void delete(Object object) {
em.getTransaction().begin();
em.remove(object);
em.getTransaction().commit();
}
public void persist(Object object) {
em.persist(object);
}
}
所有這些都運行良好,沒有異常,但是問題是產品從未真正從數據庫中刪除
您必須在Products Class中重寫equals和hashcode方法,或者可以嘗試執行此操作
public void delete(Object object) {
em.getTransaction().begin();
em.remove(em.merge(object));
em.getTransaction().commit();
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.