Java 即使我调用了em.remove(),JPA也没有删除数据库中的对象

Java 即使我调用了em.remove(),JPA也没有删除数据库中的对象,java,jsf,jpa,jakarta-ee,jpa-2.0,Java,Jsf,Jpa,Jakarta Ee,Jpa 2.0,我对开发JavaEE和JSFWeb应用程序非常陌生。我无法通过单击按钮从数据库中删除对象 所以我所做的就是单击JSF页面上的一个按钮 <h:commandButton value="Remove" action="#{productManagementBean.removeProd(product.id)}"/> 该方法将调用operationsBean中的方法 @Stateless public class OperationsBean implements Operation

我对开发JavaEE和JSFWeb应用程序非常陌生。我无法通过单击按钮从数据库中删除对象

所以我所做的就是单击JSF页面上的一个按钮

 <h:commandButton value="Remove" action="#{productManagementBean.removeProd(product.id)}"/>
该方法将调用operationsBean中的方法

@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);
} 
}
@无状态
公共类OperationsBean实现OperationsBeanLocal{
@PersistenceContext(unitName=“My_Project-ejbPU”)
私人实体管理者;
@凌驾
公共列表getAllProducts(){
返回em.createQuery(“从产品p中选择p”).getResultList();
}
@凌驾
公共整数checkIfQueryExists(字符串查询){
List products=em.createQuery(“从products p中选择p,其中p.description=:description”)
.setParameter(“说明”,查询)
.getResultList();
返回产品。大小();
}
@凌驾
公共产品getProduct(字符串查询){
//Products product=(Products)em.createQuery(“从Products p中选择p,其中p.name=:name”)
//.setParameter(“名称”,查询)
//.getSingleResult();
产品p=null;
List products=em.createQuery(“从products p中选择p,其中p.name=:name”)
.setParameter(“名称”,查询)
.getResultList();
如果(!products.isEmpty()){
p=产品。获取(0);
}
返回p;
}
@凌驾
公共产品getProductById(整数id){
Products product=(Products)em.createQuery(“从Products p中选择p,其中p.id=:id”)
.setParameter(“id”,id)
.getSingleResult();
退货产品;
}
@凌驾
公共产品getProductByName(字符串名称){
Products product=(Products)em.createQuery(“从Products p中选择p,其中p.name=:name”)
.setParameter(“名称”,名称)
.getSingleResult();
退货产品;
}
@凌驾
public void removeProd(整数id){
List products=em.createQuery(“从products p中选择p,其中p.id=:id”)
.setParameter(“id”,id)
.getResultList();
如果(!products.isEmpty()){
删除(products.get(0));
}
}
公共无效删除(对象){
em.getTransaction().begin();
em.remove(对象);
em.getTransaction().commit();
}
公共void持久化(对象){
em.persist(object);
} 
}

这一切运行正常,没有例外,但问题是产品从未从数据库中实际删除

您必须重写Products类中的equals和hashcode方法,或者您可以尝试这样做

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

为JPA设置正确的日志记录,并检查您的SQL是否在事务下被调用。
public void delete(Object object) {
    em.getTransaction().begin();
    em.remove(em.merge(object));
    em.getTransaction().commit();
}