【问题标题】:JPA is not deleting an object in my database even though I called em.remove()即使我调用了 em.remove(),JPA 也没有删除我的数据库中的对象
【发布时间】:2017-09-24 07:17:45
【问题描述】:

我对开发 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);
}
}

该方法将调用我的操作Bean中的一个方法

@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);
} 
}

这一切都运行良好,无一例外,但问题是产品实际上从未从数据库中删除

【问题讨论】:

  • 为 JPA 设置正确的日志记录并检查您的 sqls 是否在事务下被调用。

标签: java jsf jpa jakarta-ee jpa-2.0


【解决方案1】:

你必须在 Products 类中重写 equals 和 hashcode 方法,或者你可以试试这个

public void delete(Object object) {
    em.getTransaction().begin();
    em.remove(em.merge(object));
    em.getTransaction().commit();
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-01-30
    • 1970-01-01
    • 2023-04-03
    • 1970-01-01
    • 2021-01-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多