簡體   English   中英

即使我調用em.remove(),JPA也不會刪除數據庫中的對象

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM