2012-04-27 18 views
0

JPAコントローラクラスのメソッドedit()は、エンティティが既に存在するかどうかをチェックしません。既存のエンティティを編集したいので、例外をスローする必要があると思います。新しいエンティティを追加しないでください。ありがとう。たとえば :JPAコントローラクラスメソッド編集は、エンティティが既に存在するかどうかをチェックするのではなく、新しいエンティティを追加します。

import controller.exceptions.NonexistentEntityException; 
import controller.exceptions.PreexistingEntityException; 
import entity.PersonNew; 
import java.io.Serializable; 
import java.util.List; 
import javax.persistence.EntityManager; 
import javax.persistence.EntityManagerFactory; 
import javax.persistence.Query; 
import javax.persistence.EntityNotFoundException; 
import javax.persistence.criteria.CriteriaQuery; 
import javax.persistence.criteria.Root; 

public class PersonNewJpaController implements Serializable { 

    public PersonNewJpaController(EntityManagerFactory emf) { 
     this.emf = emf; 
    } 
    private EntityManagerFactory emf = null; 

    public EntityManager getEntityManager() { 
     return emf.createEntityManager(); 
    } 

    public void create(PersonNew personNew) throws PreexistingEntityException, Exception { 
     EntityManager em = null; 
     try { 
      em = getEntityManager(); 
      em.getTransaction().begin(); 
      em.persist(personNew); 
      em.getTransaction().commit(); 
     } catch (Exception ex) { 
      if (findPersonNew(personNew.getId()) != null) { 
       throw new PreexistingEntityException("PersonNew " + personNew + " already exists.", ex); 
      } 
      throw ex; 
     } finally { 
      if (em != null) { 
       em.close(); 
      } 
     } 
    } 

    public void edit(PersonNew personNew) throws NonexistentEntityException, Exception { 
     EntityManager em = null; 
     try { 
      em = getEntityManager(); 
      em.getTransaction().begin(); 
      personNew = em.merge(personNew); 
      em.getTransaction().commit(); 
     } 
     catch (Exception ex) 
     { 
      String msg = ex.getLocalizedMessage(); 
      if (msg == null || msg.length() == 0) 
      { 
       Long id = personNew.getId(); 
       if (findPersonNew(id) == null) { 
        throw new NonexistentEntityException("The personNew with id " + id + " no longer exists."); 
       } 
      } 
      throw ex; 
     } 
     finally { 
      if (em != null) { 
       em.close(); 
      } 
     } 
    } 

    public void destroy(Long id) throws NonexistentEntityException { 
     EntityManager em = null; 
     try { 
      em = getEntityManager(); 
      em.getTransaction().begin(); 
      PersonNew personNew; 
      try { 
       personNew = em.getReference(PersonNew.class, id); 
       personNew.getId(); 
      } catch (EntityNotFoundException enfe) { 
       throw new NonexistentEntityException("The personNew with id " + id + " no longer exists.", enfe); 
      } 
      em.remove(personNew); 
      em.getTransaction().commit(); 
     } finally { 
      if (em != null) { 
       em.close(); 
      } 
     } 
    } 

    public List<PersonNew> findPersonNewEntities() { 
     return findPersonNewEntities(true, -1, -1); 
    } 

    public List<PersonNew> findPersonNewEntities(int maxResults, int firstResult) { 
     return findPersonNewEntities(false, maxResults, firstResult); 
    } 

    private List<PersonNew> findPersonNewEntities(boolean all, int maxResults, int firstResult) { 
     EntityManager em = getEntityManager(); 
     try { 
      CriteriaQuery cq = em.getCriteriaBuilder().createQuery(); 
      cq.select(cq.from(PersonNew.class)); 
      Query q = em.createQuery(cq); 
      if (!all) { 
       q.setMaxResults(maxResults); 
       q.setFirstResult(firstResult); 
      } 
      return q.getResultList(); 
     } finally { 
      em.close(); 
     } 
    } 

    public PersonNew findPersonNew(Long id) { 
     EntityManager em = getEntityManager(); 
     try { 
      return em.find(PersonNew.class, id); 
     } finally { 
      em.close(); 
     } 
    } 

    public int getPersonNewCount() { 
     EntityManager em = getEntityManager(); 
     try { 
      CriteriaQuery cq = em.getCriteriaBuilder().createQuery(); 
      Root<PersonNew> rt = cq.from(PersonNew.class); 
      cq.select(em.getCriteriaBuilder().count(rt)); 
      Query q = em.createQuery(cq); 
      return ((Long) q.getSingleResult()).intValue(); 
     } finally { 
      em.close(); 
     } 
    } 

} 

メインクラス

PersonNew p = new PersonNew(); 
p.setId(new Long(22)); 
p.setName("Ahh adas"); 
p.setAddress("Salatiga, Indonesia"); 
p.setPhonenumber("+6281390989669"); 
EntityManagerFactory emf = Persistence.createEntityManagerFactory("simple-jpaPU"); 
PersonNewJpaController con=new PersonNewJpaController(emf); 

try 
{ 
con.edit(p); 
} 

catch (NonexistentEntityException ex) 
{ 
    Logger.getLogger(Demo.class.getName()).log(Level.SEVERE, null, ex); 
} 
catch (Exception ex) 
{ 
    Logger.getLogger(Demo.class.getName()).log(Level.SEVERE, null, ex); 
} 

ID 22を持つ人ではなく、それが実体を更新することになった新しいものを作成し、ID 22を持つエンティティが存在しない場合しない場合例外がスローされるはずです。あなたの編集(PersonNew)メソッドで

+0

どのクラスが 'con'ですか? JPAエンティティは、エンティティマネージャのmergeメソッドによって保存されます。あなたはそれをどこに呼んでいるのかを示してください。 – Perception

+0

私はコードを更新しました。 –

+0

これは優れていますが、コードサンプルには、コントローラクラスとエンティティマネージャのやりとりがまだありません。これを追加して、コードに何が間違っているかを確認してください。 – Perception

答えて

0

、次のコードを持っている:

em.getTransaction().begin(); 
personNew = em.merge(personNew); 
em.getTransaction().commit(); 

をしかし、あなたが望むより多くの作成や更新などの行為ではなく、純粋に、更新をマージします。ちょっと手作業によるチェックを追加すると、自分でロジックを処理できます。次のようになります。

em.getTransaction().begin(); 
Long newId = personNew.getId(); 
PersonNew personOld = em.find(PersonNew.class, newId); 
if (personOld == null) 
    throw new NonexistentEntityException("The personNew with id " 
     + newId + " no longer exists."); 
personNew = em.merge(personNew); 
em.getTransaction().commit(); 

このように新しいIDが存在しない場合は、あなたが意図していた例外がスローされます。

また、直後にcatch (Exception ex)ビットを取り除く必要があります。そうしないと、妨げられます。しかし、これは大丈夫です。これはあなたがそこでやろうとしていたことを達成するだけでなく、恐ろしいthrows Exceptionビットをメソッドのシグネチャから削除することになるからです。

+0

おかげで。私の問題を解決しました。 –

関連する問題