JPA Com Hibernate Paulo Ricardo Lisboa de Almeida 1
Modelo Necessário Modelo Necessário 2
JPA Mapeamento Direto entre as classes e o banco de dados Orientação a objetos para modelo relacional Feito através de xml ou de anotações Java Durante o curso utilizaremos anotações 3
JPA Especificação e conjunto de interfaces Pacote javax.persistence Uma engine que implementa o JPA deve ser plugável Devemos ser capazes de trocar uma engine por outra sem problemas Exemplos de implementações do JPA (engines) Hibernate e EclipseLink Será utilizado o Hibernate durante o curso 4
Criando um Projeto com JPA Da mesma forma que com JDBC Crie um Novo Projeto Java Adicione o.jar do Driver JDBC do Banco ao Projeto (buildpath) Baixe as dependências necessárias do Hibernate em www.hibernate.org Utilizaremos o Hibernate 5.2.0-final Descompacte a pasta do Hibernate e adicione todos os jars que estão dentro de lib/required no buildpath do projeto 5
Criando um Projeto JPA Dentro da pasta source (src) do projeto, crie uma pasta chamada META-INF Dentro desta pasta insira o arquivo persistence.xml disponível no site da disciplina O persistence.xml contém as configurações do banco de dados e do Hibernate, como a string de conexão, o nome de usuário, o modo de conexão,... 6
Algumas Propriedades do persistence.xml Propriedades do JPA driver nome completo da classe do driver de conexão url definição da localização do banco e o nome da base user usuário do banco de dados password senha do usuário 7
Algumas Propriedades do persistence.xml Propriedades do Hibernate dialect define qual variação do SQL será utilizada hbm2ddl.auto valida e exporta o esquema DDL para a base de dados Nunca utilizar essa opção, exceto para aplicações de teste show_sql define quando mostrar no log as consultas SQL geradas format_sql formata o log das consultas SQL geradas 8
Criando um Mapeamento Criam-se Beans para as entidades do banco (Da mesma forma que fizemos para JDBC) public class Pessoa { private Integer id; private Long cpf; private String nome; private Date nascimento; //... } 9
Criando um Mapeamento - Anotações Para informar o JPA que o Bean é uma entidade mapeada no Banco, podemos utilizar as seguintes anotaçẽos na classe @Entity Indica que a classe é mapeada em uma tabela no banco Deve aparecer antes do nome de uma classe @Table(name = "NOME_DA_TABELA_BANCO") Diz qual o nome da tabela para qual a entidade será mapeada Opcional caso o nome da tabela e da classe sejam os mesmos 10
Criando um Mapeamento Anotações Nos Atributos Os atributos também podem receber diversas anotações. Algumas delas: @Id Indica qual é o atributo mapeado como chave primária no banco. Toda entidade deve ter um ID. @GeneratedValue Geralmente acompanhado da anotação @Id Indica que o valor do campo é gerado automaticamente @Id @GeneratedValue(strategy=GenerationType.IDENTITY) private Integer id; 11
Criando um Mapeamento Anotações Nos Atributos @Column Define várias propriedades dos atributos que são mapeados para as colunas das tabelas. Dentre eles: name="nomecoluna" Define o nome da coluna para a qual o atributo é mapeado Necessário somente se o nome da coluna e do atributo forem diferentes lenght=valor Define a quantidade de caracteres de um campo string nullable = true ou false Define se o campo pode receber valores nulos unique=true ou false Define se a coluna pode ter valores repetidos ou não Ex.: o campo cpf deve ser marcado como unique, pois duas pessoas não podem ter o mesmo cpf 12
Criando um Mapeamento Anotações Nos Atributos Propriedades de @Column (Continuação) precision=valor Define a quantidade de dígitos de um número decimal scale=valor Determina a quantidade de casas decimais de um número Exemplo com precision e scale, onde temperaturaatual é armazenada com 4 dígitos, dos quais 2 representam as casas decimais. @Column ( precision =4, scale =2) private BigDecimal temperaturaatual; 13
Exemplo de Mapeamento @Entity @Table(name="Pessoa") public class Pessoa { @Id @GeneratedValue(strategy=GenerationType.IDENTITY) @Column(name="pessoa_id", updatable=false) private Integer id; @Column(nullable=false, unique=true) private Long cpf; @Column(length=50, nullable=false) private String nome; @Column(nullable=true) private Date nascimento; // } 14
Hashcode e Equals Para que o JPA funcione corretamente você deve implementar HashCode e Equals em todos os seus Beans Boa prática de programação independentemente se estamos ou não utilizando JPA Implementar para todas as entidades é uma prática ainda melhor Bons documentos com diretivas para implementação do hashcode e Equals Joshua Bloch. Effective Java: 2nd Edition. 2008. Documentação da Oracle Veja a especificação de Object 15
Manipulando Dados no Banco Utiliza-se a classe EntityManager Cria-se um EntityManager através do Factory EntityManagerFactory O parâmetro nome_unidade_persistencia define qual unidade de persistência definida no persistence.xml será utilizada No nosso projeto ele se chama clinica_pu EntityManagerFactory factory = Persistence.createEntityManagerFactory("nome_unidade_persistencia"); EntityManager em = factory.createentitymanager(); 16
Métodos do EntityManager para Manipular os Dados persist(entidade) Armazenar entidade no banco find(entidade.class, identidade) Recupera a entidade com o id desejado do banco getreference(entidade.class, identidade) Recupera a entidade, mas suas propriedades somente são carregadas quando necessário Somente um proxy é recebido remove(entidade) Remove a entidade do banco Utilizar o find antes para carregar a entidade, para depois removê-la O objeto deve estar atachado para ser removido 17
Transações Para executar um método do EntityManager a fim de manipular os dados, uma transação deve existir. Exemplo: Animal animal = null; em.gettransaction().begin(); animal = em.find(animal.class, 3); em.gettransaction().commit(); Onde begin inicia uma conexão e uma transação Commit envia as alterações ao banco, fecha a transação e a conexão Esses comportamentos são os padrão, e podem ser modificados no persistense.xml 18
Transações Para executar um método do EntityManager a fim de manipular os dados, uma transação deve existir. Exemplo: Animal animal = null; em.gettransaction().begin(); animal = em.find(animal.class, 3); em.gettransaction().commit(); Onde begin inicia uma conexão e uma transação Commit envia as alterações ao banco, fecha a transação e a conexão Esses comportamentos são os padrão, e podem ser modificados no persistense.xml Caso necessário, podemos fazer um rollback através de em.gettransaction().rollback(); 19
Fim! Resolva os exercícios propostos! 20