/* * To change this template, choose Tools | Templates * and open the template in the editor. */ package org.ufcspa.simdecs.bn.jpa; 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; import javax.transaction.UserTransaction; import org.ufcspa.simdecs.bn.entity.Answer; import org.ufcspa.simdecs.bn.entity.Question; import org.ufcspa.simdecs.bn.jpa.exceptions.NonexistentEntityException; import org.ufcspa.simdecs.bn.jpa.exceptions.RollbackFailureException; /** * * @author mchelem */ public class AnswerJpaController implements Serializable { public AnswerJpaController(UserTransaction utx, EntityManagerFactory emf) { this.utx = utx; this.emf = emf; } private UserTransaction utx = null; private EntityManagerFactory emf = null; public EntityManager getEntityManager() { return emf.createEntityManager(); } public void create(Answer answer) throws RollbackFailureException, Exception { EntityManager em = null; try { utx.begin(); em = getEntityManager(); Question question = answer.getQuestion(); if (question != null) { question = em.getReference(question.getClass(), question.getId()); answer.setQuestion(question); } em.persist(answer); if (question != null) { question.getAnswers().add(answer); question = em.merge(question); } utx.commit(); } catch (Exception ex) { try { utx.rollback(); } catch (Exception re) { throw new RollbackFailureException("An error occurred attempting to roll back the transaction.", re); } throw ex; } finally { if (em != null) { em.close(); } } } public void edit(Answer answer) throws NonexistentEntityException, RollbackFailureException, Exception { EntityManager em = null; try { utx.begin(); em = getEntityManager(); Answer persistentAnswer = em.find(Answer.class, answer.getId()); Question questionOld = persistentAnswer.getQuestion(); Question questionNew = answer.getQuestion(); if (questionNew != null) { questionNew = em.getReference(questionNew.getClass(), questionNew.getId()); answer.setQuestion(questionNew); } answer = em.merge(answer); if (questionOld != null && !questionOld.equals(questionNew)) { questionOld.getAnswers().remove(answer); questionOld = em.merge(questionOld); } if (questionNew != null && !questionNew.equals(questionOld)) { questionNew.getAnswers().add(answer); questionNew = em.merge(questionNew); } utx.commit(); } catch (Exception ex) { try { utx.rollback(); } catch (Exception re) { throw new RollbackFailureException("An error occurred attempting to roll back the transaction.", re); } String msg = ex.getLocalizedMessage(); if (msg == null || msg.length() == 0) { Long id = answer.getId(); if (findAnswer(id) == null) { throw new NonexistentEntityException("The answer with id " + id + " no longer exists."); } } throw ex; } finally { if (em != null) { em.close(); } } } public void destroy(Long id) throws NonexistentEntityException, RollbackFailureException, Exception { EntityManager em = null; try { utx.begin(); em = getEntityManager(); Answer answer; try { answer = em.getReference(Answer.class, id); answer.getId(); } catch (EntityNotFoundException enfe) { throw new NonexistentEntityException("The answer with id " + id + " no longer exists.", enfe); } Question question = answer.getQuestion(); if (question != null) { question.getAnswers().remove(answer); question = em.merge(question); } em.remove(answer); utx.commit(); } catch (Exception ex) { try { utx.rollback(); } catch (Exception re) { throw new RollbackFailureException("An error occurred attempting to roll back the transaction.", re); } throw ex; } finally { if (em != null) { em.close(); } } } public List findAnswerEntities() { return findAnswerEntities(true, -1, -1); } public List findAnswerEntities(int maxResults, int firstResult) { return findAnswerEntities(false, maxResults, firstResult); } private List findAnswerEntities(boolean all, int maxResults, int firstResult) { EntityManager em = getEntityManager(); try { CriteriaQuery cq = em.getCriteriaBuilder().createQuery(); cq.select(cq.from(Answer.class)); Query q = em.createQuery(cq); if (!all) { q.setMaxResults(maxResults); q.setFirstResult(firstResult); } return q.getResultList(); } finally { em.close(); } } public Answer findAnswer(Long id) { EntityManager em = getEntityManager(); try { return em.find(Answer.class, id); } finally { em.close(); } } public int getAnswerCount() { EntityManager em = getEntityManager(); try { CriteriaQuery cq = em.getCriteriaBuilder().createQuery(); Root rt = cq.from(Answer.class); cq.select(em.getCriteriaBuilder().count(rt)); Query q = em.createQuery(cq); return ((Long) q.getSingleResult()).intValue(); } finally { em.close(); } } }