2017-12-03 1 views
1

JPAで作業を開始して休止状態になり、1つのテーブルにクエリと更新を挿入できましたが、エンティティを削除できないようです。マージ機能を使ってエンティティをアタッチした後でも、プログラムはそれが分離されていると主張します。ここに関連するコードは次のとおりです。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のdeattachedインスタンスを削除します」。

私は明示的にマージを呼び出した後、このBeanがまだデタッチされている理由を誰かが説明できますか?また、私はこの問題をどのように修正するのでしょうか?ありがとう。

答えて

1

指定取り外しエンティティ・オブジェクトの内容が同じアイデンティティ(すなわち、同じタイプ 主キー)と 既存の管理されたエンティティ・オブジェクトにコピーされます。 EntityManagerがそのようなエンティティを管理しない場合、 オブジェクトはまだ新しいマネージエンティティオブジェクトが構築されます。ただし、切り離された オブジェクト自体は変更されずにそのまま残ります。

後も

user = em.merge(user); //TODO update find to take transaction as parameter 
em.remove(user); 
分離オブジェクト自体は切り離さままマージ、マージ新しく作成マージされたエンティティを返します。
関連する問題