Entidade Tarefa
package br.com.ygormagalhaes.sgcv.tarefas.model;
import java.io.Serializable;
import java.util.Calendar;
import java.util.List;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import br.com.ygormagalhaes.sgcv.pessoas.model.Usuario;
import br.com.ygormagalhaes.sgcv.projetos.model.Fase;
import br.com.ygormagalhaes.sgcv.projetos.model.Projeto;
@Entity
public class Tarefa implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue
private Integer id;
private String nome;
@Column(columnDefinition = "text")
private String descricao;
@ManyToOne
private Usuario responsavel = new Usuario();
@Temporal(TemporalType.TIMESTAMP)
private Calendar dataCriacao = Calendar.getInstance();
@Temporal(TemporalType.TIMESTAMP)
private Calendar dataPrazo = Calendar.getInstance();
private Boolean finalizada = false;
@ManyToOne
private Projeto projeto = new Projeto();
@ManyToOne
private Fase fase = new Fase();
@OneToMany(cascade = CascadeType.PERSIST)
private List<Interacao> interacoes;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getNome() {
return nome;
}
public void setNome(String nome) {
this.nome = nome;
}
public String getDescricao() {
return descricao;
}
public void setDescricao(String descricao) {
this.descricao = descricao;
}
public Usuario getResponsavel() {
return responsavel;
}
public void setResponsavel(Usuario responsavel) {
this.responsavel = responsavel;
}
public Calendar getDataCriacao() {
return dataCriacao;
}
public void setDataCriacao(Calendar dataCriacao) {
this.dataCriacao = dataCriacao;
}
public Calendar getDataPrazo() {
return dataPrazo;
}
public void setDataPrazo(Calendar dataPrazo) {
this.dataPrazo = dataPrazo;
}
public Boolean getFinalizada() {
return finalizada;
}
public void setFinalizada(Boolean finalizada) {
this.finalizada = finalizada;
}
public Projeto getProjeto() {
return projeto;
}
public void setProjeto(Projeto projeto) {
this.projeto = projeto;
}
public Fase getFase() {
return fase;
}
public void setFase(Fase fase) {
this.fase = fase;
}
public List<Interacao> getInteracoes() {
return interacoes;
}
public void setInteracoes(List<Interacao> interacoes) {
this.interacoes = interacoes;
}
@Override
public String toString() {
return "Tarefa [id=" + id + ", nome=" + nome + ", descricao=" + descricao + ", responsavel="
+ responsavel.getNome() + ", dataCriacao=" + dataCriacao + ", dataPrazo=" + dataPrazo + ", finalizada="
+ finalizada + "]";
}
}
Entidade Interacao
package br.com.ygormagalhaes.sgcv.tarefas.model;
import java.io.Serializable;
import java.util.Calendar;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.ManyToOne;
import br.com.ygormagalhaes.sgcv.pessoas.model.Usuario;
@Entity
public class Interacao implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue
private Integer id;
@ManyToOne
private Usuario usuario = new Usuario();
private Calendar dataEHora = Calendar.getInstance();
@Column(columnDefinition = "text")
private String texto;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public Usuario getUsuario() {
return usuario;
}
public void setUsuario(Usuario usuario) {
this.usuario = usuario;
}
public Calendar getDataEHora() {
return dataEHora;
}
public void setDataEHora(Calendar dataEHora) {
this.dataEHora = dataEHora;
}
public String getTexto() {
return texto;
}
public void setTexto(String texto) {
this.texto = texto;
}
}
TarefaDAO
package br.com.ygormagalhaes.sgcv.tarefas.dao;
import java.io.Serializable;
import java.util.List;
import javax.annotation.PostConstruct;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.TypedQuery;
import org.springframework.stereotype.Repository;
import br.com.ygormagalhaes.sgcv.dao.DAO;
import br.com.ygormagalhaes.sgcv.projetos.model.Projeto;
import br.com.ygormagalhaes.sgcv.tarefas.model.Tarefa;
@Repository
public class TarefaDAO implements Serializable {
private static final long serialVersionUID = 1L;
@PersistenceContext
private EntityManager entityManager;
private DAO<Tarefa> dao;
@PostConstruct
public void init() {
dao = new DAO<Tarefa>(entityManager, Tarefa.class);
}
public void adiciona(Tarefa t) {
dao.adiciona(t);
}
public void remove(Tarefa t) {
dao.remove(t);
}
public void atualiza(Tarefa t) {
dao.atualiza(t);
}
public List<Tarefa> listaTodos() {
return dao.listaTodos();
}
public Tarefa buscaPorId(Integer id) {
return dao.buscaPorId(id);
}
public int contaTodos() {
return dao.contaTodos();
}
public List<Tarefa> listaTarefasPorProjeto(Projeto projeto) {
TypedQuery<Tarefa> query = entityManager.createQuery("select t from Tarefa t where t.projeto=:pProjeto",
Tarefa.class);
query.setParameter("pProjeto", projeto);
return query.getResultList();
}
public Tarefa carregaTarefaComInteracoes(Integer id) {
TypedQuery<Tarefa> query = entityManager
.createQuery("select distinct t from Tarefa t join fetch t.interacoes where t.id=:pId", Tarefa.class);
query.setParameter("pId", id);
return query.getSingleResult();
}
}
DAO generico
package br.com.ygormagalhaes.sgcv.dao;
import java.io.Serializable;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Root;
public class DAO<T> implements Serializable {
private static final long serialVersionUID = 1L;
private final Class<T> classe;
private EntityManager em;
public DAO(EntityManager em, Class<T> classe) {
this.em = em;
this.classe = classe;
}
public void adiciona(T t) {
em.persist(t);
}
public void remove(T t) {
em.remove(em.merge(t));
}
public void atualiza(T t) {
em.merge(t);
}
public List<T> listaTodos() {
CriteriaQuery<T> query = em.getCriteriaBuilder().createQuery(classe);
query.select(query.from(classe));
List<T> lista = em.createQuery(query).getResultList();
return lista;
}
public T buscaPorId(Integer id) {
T instancia = em.find(classe, id);
return instancia;
}
public int contaTodos() {
long result = (Long) em.createQuery("select count(n) from livro n").getSingleResult();
return (int) result;
}
public List<T> listaTodosPaginada(int firstResult, int maxResults, String coluna, String valor) {
CriteriaQuery<T> query = em.getCriteriaBuilder().createQuery(classe);
Root<T> root = query.from(classe);
if (valor != null)
query = query.where(em.getCriteriaBuilder().like(root.<String>get(coluna), valor + "%"));
System.out.println(coluna + " : " + valor);
List<T> lista = em.createQuery(query).setFirstResult(firstResult).setMaxResults(maxResults).getResultList();
return lista;
}
}
InteracaoBean
package br.com.ygormagalhaes.sgcv.tarefas.bean;
import java.io.Serializable;
import javax.faces.view.ViewScoped;
import javax.inject.Inject;
import javax.persistence.NoResultException;
import org.springframework.stereotype.Controller;
import org.springframework.transaction.annotation.Transactional;
import br.com.ygormagalhaes.sgcv.tarefas.dao.TarefaDAO;
import br.com.ygormagalhaes.sgcv.tarefas.model.Interacao;
import br.com.ygormagalhaes.sgcv.tarefas.model.Tarefa;
@Controller
@ViewScoped
public class InteracaoBean implements Serializable {
private static final long serialVersionUID = 1L;
@Inject
private TarefaDAO tarefaDAO;
private Interacao interacao = new Interacao();
private Tarefa tarefa = new Tarefa();
public Tarefa getTarefa() {
return tarefa;
}
public void setTarefa(Tarefa tarefa) {
this.tarefa = tarefa;
}
public void carregaTarefa() {
try {
tarefa = tarefaDAO.carregaTarefaComInteracoes(tarefa.getId());
} catch (NoResultException e) {
System.out.println("A tarefa ainda não possui interações.");
tarefa = tarefaDAO.buscaPorId(tarefa.getId());
}
if (tarefa == null) {
tarefa = new Tarefa();
}
}
public Interacao getInteracao() {
return interacao;
}
public void setInteracao(Interacao interacao) {
this.interacao = interacao;
}
// TODO lembrar de atualizar a futura lista de interações
@Transactional
public void salvarInteracao() {
this.tarefa.getInteracoes().add(interacao);
tarefaDAO.atualiza(tarefa);
}
}
Ae Alisson as classes