Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Dúvida no Ex. 9 da Aula 4 - Completando o sistema e lidando com escopos do JSF 2

Gostaria de saber se alguém pode me dar uma ajuda, pois eu mesmo fiz a implementação do JPA no projeto(obs. não utilizei o código fonte disponibilizado)

O meu programa está persistindo corretamente no banco de dados a classe Livro e a classe Autor, mas não está dando insert na tabela Livro_autor do relacionamento muito para muitos bidirecional.

Classe Livro

package br.com.alura.modelo;

import java.util.ArrayList;
import java.util.List;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.ManyToMany;

@Entity
public class Livro {
    @Id
    @GeneratedValue (strategy = GenerationType.IDENTITY)
    private int id;
    private String titulo;
    private String isbn;
    private double preco;
    private String data;

    @ManyToMany
    private List<Autor> autores = new ArrayList<Autor>(); 

    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + id;
        return result;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        Livro other = (Livro) obj;
        if (id != other.id)
            return false;
        return true;
    }

    /**
     * Adiciona o autor informado no formulário no arraylist de autores do livro. Um livro pode ter vários autores.
     * @param autor
     */
    public void adicionaAutor(Autor autor){
        getAutores().add(autor);
        System.out.println(autor.getNome() +" adicionado no livro");
    }

    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getTitulo() {
        return titulo;
    }
    public void setTitulo(String titulo) {
        this.titulo = titulo;
    }
    public String getIsbn() {
        return isbn;
    }
    public void setIsbn(String isbn) {
        this.isbn = isbn;
    }
    public double getPreco() {
        return preco;
    }
    public void setPreco(double preco) {
        this.preco = preco;
    }
    public String getData() {
        return data;
    }
    public void setData(String data) {
        this.data = data;
    }
    public List<Autor> getAutores() {
        return autores;
    }

}

Classe Autor

package br.com.alura.modelo;

import java.util.ArrayList;
import java.util.List;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.ManyToMany;

@Entity
public class Autor {
    @Id
    @GeneratedValue (strategy = GenerationType.IDENTITY)
    private int id;
    private String nome;
    @ManyToMany (mappedBy = "autores")
    private List<Livro>livros= new ArrayList<Livro>(); 


    public List<Livro> getLivros() {
        return livros;
    }

    public void setLivros(List<Livro> livros) {
        this.livros = livros;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }


    public String getNome() {
        return nome;
    }

    public void setNome(String nome) {
        this.nome = nome;
    }


}
2 respostas

Link do código fonte:

https://drive.google.com/folderview?id=0B9-DnbAKaf_WZVk4aHEwSk1UYzA&usp=sharing
solução!

Subistituí a classe LivroDAO e a classe AutorDAO pela classe genérica DAO:

package br.com.alura.daos;

import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.criteria.CriteriaQuery;
import br.com.alura.util.JPA_Util;

public class DAO<T> {

    private final Class<T> classe;

    public DAO(Class<T> classe){
        this.classe = classe;
    }
    /**
     * Persistir o objeto no banco de dados
     * @param t
     */
    public void inserir (T t){
        EntityManager manager = new JPA_Util().getEntityManager();
        manager.getTransaction().begin();
        manager.persist(t);
        manager.getTransaction().commit();
        manager.close();
    }
    /**
     * Atualizar o objeto no banco de dados
     * @param t
     */
    public void atualizar (T t){
        EntityManager manager = new JPA_Util().getEntityManager();
        manager.getTransaction().begin();
        manager.merge(t);
        manager.getTransaction().commit();
        manager.close();
    }
    /**
     * Remover o objeto no banco de dados
     * @param t
     */
    public void excluir (T t){
        EntityManager manager = new JPA_Util().getEntityManager();
        manager.getTransaction().begin();
        manager.remove(manager.merge(t));
        manager.getTransaction().commit();
        manager.close();
    }

    /**
     * Buscar todos elementos do tipo especificado do banco de dados
     * @return
     */
    public List<T> todos(){
        EntityManager manager = new JPA_Util().getEntityManager();
        CriteriaQuery<T> query = manager.getCriteriaBuilder().createQuery(classe);
        query.select(query.from(classe));

        List<T> lista = manager.createQuery(query).getResultList();

        manager.close();
        return lista;
    }

    public T buscarPorId(int id){
        EntityManager manager = new JPA_Util().getEntityManager();
        T instancia = manager.find(classe, id);
        manager.close();
        return instancia;
    }

    public int contarQuantidade(){
        EntityManager manager = new JPA_Util().getEntityManager();
        long result = (Long) manager.createQuery("select count(l) from livro l").getSingleResult();
        manager.close();
        return (int) result;
    }
}