Injetando o EntityManager
Até agora usamos a classe Banco para simular um banco de dados, mas chegou a hora de realmente persistir os dados. O primeiro passo é injetar o EntityManager; interface principal da especificação JPA. Para tanto, onde usávamos Banco, passaremos a usar o EntityManger.
O EntityManager possui métodos de alto nível para trabalharmos com objetos. Para salvar o autor podemos usar o método persist():
manager.persist(autor);
Para listar todos os autores, basta executar uma query:
manager.createQuery("select a from Autor a", Autor.class).getResultList();
Por último, podemos procurar um autor pelo id:
manager.find(Autor.class, autorId);
Pronto, a classe AutorDao já está compilando, agora só falta ajustar a anotação de injeção de dependência. Quando injetamos um EntityManager não podemos utilizar a anotação @Inject. Nesse caso, o Contexts and Dependency Injection (CDI), outra especificação com o foco na injeção de dependência, buscaria o EntityManager. No entanto não encontraria o objeto e causaria uma exceção. Como o EJB Container administrará o JPA, é preciso usar uma anotação especifica do mundo EJB, nesse caso @PersistenceContext:
@PersistenceContext
EntityManager manager;
Isso fará com que o EJB Container injete o EntityManager. Mas qual banco de dados vamos utilizar e qual é o endereço desse banco? Para tudo isso realmente funcionar, temos que definir algumas configurações sobre o banco de dados.
Mas como e a classe EntiniManager ?
Meu AutorDAO ficou assim:
@Stateless
public class AutorDao {
@Inject
private Banco banco;
public void salva(Autor autor) {
manager.persist(autor);
}
public List<Autor> todosAutores() {
manager.createQuery("select a from Autor a", Autor.class).getResultList();
}
public Autor buscaPelaId(Integer autorId) {
manager.find(Autor.class, autorId);
}
So que todo manager. da erro