【问题标题】:JPA remove detached entityJPA 删除分离的实体
【发布时间】:2017-12-03 21:58:54
【问题描述】:

我刚刚开始使用 JPA 和休眠,我已经能够在一个表上插入查询和更新,但我似乎无法删除实体。即使在我使用合并功能附加实体之后,程序仍然坚持它是分离的。以下是相关代码:

public User getUserByEmail(String email) throws DAOException{
    User user = null; 
    EntityManager em = null; //declare here for use in finally block
    try{                        
        //get em for use
        EntityManagerFactory factory = JPAUtil.getEntityManagerFactory();
        em = factory.createEntityManager();
        //setup return type as user
        CriteriaBuilder cb = em.getCriteriaBuilder();
        CriteriaQuery<User> criteriaQuery = cb.createQuery(User.class);
        Root<User> userRoot = criteriaQuery.from(User.class);
        //populate the where clause
        criteriaQuery.where(cb.equal(userRoot.get("email"), cb.parameter(String.class, "email")));          
        Query query = em.createQuery(criteriaQuery);
        query.setParameter("email", email);
        //actually run the query on db
        user = (User) query.getSingleResult();
    }catch(Exception ex){
        DAOException dE = new DAOException(2, "getUserByEmail failed", ex);
        //TODO log
        throw dE;
    }       
    //cleanup
    finally{
        if(em != null && em.isOpen()){
            em.close();
        }
    }
    return user; //if not found, will still be null
}



@Override
/*
 * (non-Javadoc)
 * @see dao.IUserDAO#deleteUser(java.lang.String)
 */
public void deleteUser(String email) throws DAOException {
    EntityManagerFactory entityManagerFactory;
    EntityManager em = null;
    EntityTransaction trans = null;
    try{            
        //search user on email
        User user = getUserByEmail(email);          
        //check we found user with specified email
        if(user != null){
            //setup for interaction with database
            entityManagerFactory = JPAUtil.getEntityManagerFactory();
            em = entityManagerFactory.createEntityManager();
            //alterations of db must occur in scope of transaction
            trans = em.getTransaction();
            trans.begin();
            em.merge(user); //TODO update find to take transaction as parameter
            em.remove(user);
            trans.commit();
            //explicitly flush here
            em.flush();             
        }else{
            //TODO we didn't find the user
        }

    }catch(Exception ex){
        DAOException dE = new DAOException(6, "delete failed", ex);
        //TODO log
        trans.rollback();
        throw dE;
    }finally{
        if(em != null && em.isOpen()){
            em.close();
        }
    }       
}

这里是 Eclipse 控制台的输出: “删除用户#1 的分离实例”。

有人可以解释为什么在我明确调用合并后这个 bean 仍然分离吗?另外,我该如何解决这个问题?谢谢。

【问题讨论】:

    标签: jpa orm


    【解决方案1】:

    将指定分离实体对象的内容复制到一个 具有相同标识(即相同类型)的现有托管实体对象 和主键)。如果 EntityManager 不管理这样的实体 对象,但构造了一个新的托管实体对象。分离的 然而,对象本身保持不变和分离。

    即使合并后分离的对象本身仍然是分离的,合并将返回新创建的合并实体

    user = em.merge(user); //TODO update find to take transaction as parameter
    em.remove(user);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-10-07
      • 2015-08-10
      • 1970-01-01
      • 2015-09-11
      • 1970-01-01
      • 1970-01-01
      • 2012-01-19
      • 1970-01-01
      相关资源
      最近更新 更多