Bom dia. Olha eu sofrendo de novo com o CDI haha' O metodo gravar não esta gravando o livro no banco.
LivroBean
package br.com.caelum.livraria.bean;
import java.io.Serializable;
import java.util.List;
import javax.faces.application.FacesMessage;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.validator.ValidatorException;
import javax.faces.view.ViewScoped;
import javax.inject.Inject;
import javax.inject.Named;
import br.com.alura.alura_lib.dao.DAO;
import br.com.alura.alura_lib.tx.annotation.Transacional;
import br.com.caelum.livraria.modelo.Autor;
import br.com.caelum.livraria.modelo.Livro;
@Named
@ViewScoped
public class LivroBean implements Serializable {
private static final long serialVersionUID = 1L;
private Livro livro = new Livro();
private Integer autorId;
private List<Livro> livros;
@Inject
private DAO<Autor> autorDao;
@Inject
private DAO<Livro> livroDao;
public void setAutorId(Integer autorId) {
this.autorId = autorId;
}
public Integer getAutorId() {
return autorId;
}
public Livro getLivro() {
return livro;
}
public List<Livro> getLivros() {
if(this.livros == null) {
this.livros = livroDao.listaTodos();
}
return livros;
}
public List<Autor> getAutores() {
return autorDao.listaTodos();
}
public List<Autor> getAutoresDoLivro() {
return this.livro.getAutores();
}
public void carregarLivroPelaId() {
this.livro = livroDao.buscaPorId(this.livro.getId());
}
@Transacional
public void gravarAutor() {
Autor autor = autorDao.buscaPorId(this.autorId);
this.livro.adicionaAutor(autor);
System.out.println("Escrito por: " + autor.getNome());
}
@Transacional
public void gravar() {
System.out.println("Gravando livro " + this.livro.getTitulo());
if (livro.getAutores().isEmpty()) {
FacesContext.getCurrentInstance().addMessage("autor",
new FacesMessage("Livro deve ter pelo menos um Autor."));
return;
}
if(this.livro.getId() == null) {
livroDao.adiciona(this.livro);
this.livros = livroDao.listaTodos();
} else {
livroDao.atualiza(this.livro);
}
this.livro = new Livro();
}
@Transacional
public void remover(Livro livro) {
System.out.println("Removendo livro");
livroDao.remove(livro);
this.livros = livroDao.listaTodos();
}
public void removerAutorDoLivro(Autor autor) {
this.livro.removeAutor(autor);
}
public void carregar(Livro livro) {
System.out.println("Carregando livro");
this.livro = livro;
}
public String formAutor() {
System.out.println("Chamanda do formulário do Autor.");
return "autor?faces-redirect=true";
}
public void comecaComDigitoUm(FacesContext fc, UIComponent component,
Object value) throws ValidatorException {
String valor = value.toString();
if (!valor.startsWith("1")) {
throw new ValidatorException(new FacesMessage(
"ISBN deveria começar com 1"));
}
}
}
package br.com.alura.alura_lib.tx.annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import javax.interceptor.InterceptorBinding;
@InterceptorBinding
@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface Transacional {
}
package br.com.alura.alura_lib.dao;
import java.io.Serializable;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.criteria.CriteriaQuery;
public class DAO<T> implements Serializable{
private static final long serialVersionUID = -1603139969274284275L;
private final Class<T> classe;
private EntityManager em;
public DAO(Class<T> classe, EntityManager em) {
this.classe = classe;
this.em = em;
}
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) {
CriteriaQuery<T> query = em.getCriteriaBuilder().createQuery(classe);
query.select(query.from(classe));
List<T> lista = em.createQuery(query).setFirstResult(firstResult)
.setMaxResults(maxResults).getResultList();
return lista;
}
}
package br.com.alura.alura_lib.factory;
import java.lang.reflect.ParameterizedType;
import javax.enterprise.inject.Produces;
import javax.enterprise.inject.spi.InjectionPoint;
import javax.inject.Inject;
import javax.persistence.EntityManager;
import br.com.alura.alura_lib.dao.DAO;
@SuppressWarnings("unchecked")
public class DAOFactory {
@Inject
private EntityManager manger;
@Produces
public <T> DAO<T> factory(InjectionPoint point){
ParameterizedType type = (ParameterizedType) point.getType();
Class<T> classe = (Class<T>) type.getActualTypeArguments()[0];
return new DAO<T>(classe, manger);
}
}
package br.com.alura.alura_lib.factory;
import javax.enterprise.context.RequestScoped;
import javax.enterprise.inject.Disposes;
import javax.enterprise.inject.Produces;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
public class JPAFactory {
private static EntityManagerFactory emf = Persistence
.createEntityManagerFactory("livraria");
@Produces
@RequestScoped
public EntityManager getEntityManager() {
return emf.createEntityManager();
}
public void close(@Disposes EntityManager em) {
if (em.isOpen()) {
em.close();
}
}
}
package br.com.alura.alura_lib.tx;
import java.io.Serializable;
import javax.inject.Inject;
import javax.interceptor.AroundInvoke;
import javax.interceptor.Interceptor;
import javax.interceptor.InvocationContext;
import javax.persistence.EntityManager;
import javax.transaction.Transactional;
@Interceptor
@Transactional
public class GerenciadorDeTransacao implements Serializable {
private static final long serialVersionUID = 1L;
private EntityManager em;
@Inject
public GerenciadorDeTransacao(EntityManager em) {
this.em = em;
}
@AroundInvoke
public Object executaComtransacao(InvocationContext context) {
em.getTransaction().begin();
try {
Object resultado = context.proceed();
em.getTransaction().commit();
return resultado;
} catch (Exception e) {
em.getTransaction().rollback();
throw new RuntimeException(e);
}
}
}