Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Persistência com JPA e Hibernate

654 views

Published on

Apresentação utilizada durante de aula de desenvolvimento para a web com Java na Bessa`s Technology

Published in: Technology, Business
  • Be the first to comment

Persistência com JPA e Hibernate

  1. 1. Persistência com JPA2 eHibernateFernando Oliveira
  2. 2. O que é persistência?
  3. 3. ModeloRelacionalCREATE TABLE user(id int not null primary key,name varchar(255) not null);CREATE TABLE post (id int not null primary key,title varchar(255) not null,content text not null,author_id int not null,FOREIGN KEY (author_id)REFERENCES user(id));Modelo Orientadoa Objetopublic class User {private Integer id;private String name;…}public class Post {private Integer id;private String title;private String content;private User author;…}
  4. 4. ORMObject-relational Mapping
  5. 5. JPAJava Persistence API
  6. 6. Onde baixar…http://www.hibernate.org/
  7. 7. ConfiguraçãoO Hibernate deve ser configurado noarquivo src/META-INF/persistence.xml
  8. 8. persistence.xml<?xml version="1.0" encoding="UTF-8" ?><persistence xmlns="http://java.sun.com/xml/ns/persistence"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://java.sun.com/xml/ns/persistencehttp://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"version="2.0"><persistence-unit name="BESSAS_DB" transaction-type="RESOURCE_LOCAL"><provider>org.hibernate.ejb.HibernatePersistence</provider><properties><property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQLDialect" /><property name="hibernate.hbm2ddl.auto" value="create" /><property name="javax.persistence.jdbc.driver" value="org.postgresql.Driver" /><property name="javax.persistence.jdbc.user" value="postgres" /><property name="javax.persistence.jdbc.password" value="postgres" /><property name="hibernate.hbm2ddl.auto" value="update" /><property name="javax.persistence.jdbc.url"value="jdbc:postgresql://localhost:5432/usuario" /></properties></persistence-unit></persistence>
  9. 9. Mapeamento
  10. 10. @EntityDefine que a classe representa uma entidade dobanco de dados@Entitypublic class Usuario {...}
  11. 11. @TablePermite definir algumas configurações para asentidades mapeadas como por exemplo o nome databela:@Entity@Table(name=“user”)public class Usuario {...}
  12. 12. @IdIndica qual atributo da classe será mapeadocomo chave primária:@Entity@Table(name=“user”)public class Usuario {@Idprivate Integer id;..}
  13. 13. @GeneratedValueUsado junto com @Id para indicar que o id serágerado automaticamente:@Entity@Table(name=“user”)public class Usuario {@Id@GeneratedValue(generator = “id”, strategy =GenerationType.IDENTITY)private Integer id;}
  14. 14. @ColumnDefine configurações das colunas:@Entity@Table(name=“user”)public class Usuario {@Id@GeneratedValue(generator = “id”, strategy = GenerationType.IDENTITY)private Integer id;@column (length=255, nullable=false)private String nome;@column(nullable=false, length=11, unique=true)private String cpf;}
  15. 15. @TransientInforma que a propriedade não deve ser persistida:@Entity@Table(name=“user”)public class Usuario {@Id@GeneratedValue(generator = “id”, strategy = GenerationType.IDENTITY)private Integer id;@column (length=255, nullable=false)private String nome;@column(nullable=false, length=11, unique=true)private String cpf;@Transientprivate String retornoTratado;}
  16. 16. Entity Manager
  17. 17. Obtendo um entityManagerpublic Usuario save (Usuario usuario) {EntityManagerFactory factory =Persistence.createEntityManagerFactory(“BESSAS_DB”);EntityManager manager = factory.createEntityManager();...}
  18. 18. TransaçãoÉ uma sequência de operações num SGBD quesão tratadas como um bloco único e indivisível
  19. 19. Sincronização com o Banco de DadosÉ a propagação das remoções, alterações e inserções para obanco de dados.Ocorre quando chamamos o método commit de umatransação.Podemos usar o método flush para fazer uma sincronizaçãosem finalizar a transação.
  20. 20. Ciclo de vida das Entidades
  21. 21. Persistindopublic void saveOrUpdate (Usuario usuario) {EntityManagerFactory factory =Persistence.createEntityManagerFactory(“BESSAS_DB”);EntityManager manager = factory.createEntityManager();manager.getTransaction().begin();try {manager.persist(usuario);manager.getTransaction().commit();} catch (Exception e) {manager.getTransaction().rollback();} finally {manager.close();}factory.close();}
  22. 22. Buscar objetopublic Usuario buscar (Integer id) {EntityManagerFactory factory = Persistence.createEntityManagerFactory(“BESSAS_DB”);EntityManager manager = factory.createEntityManager();manager.getTransaction().begin();Usuario usuario = new Usuario();try {Usuario usuario = manager.find(Usuario.class, id)manager.getTransaction().commit();} catch (Exception e) {manager.getTransaction().rollback();} finally {manager.close();}factory.close();return usuario;}
  23. 23. Remover objetopublic Usuario remover (Usuario) {EntityManagerFactory factory =Persistence.createEntityManagerFactory(“BESSAS_DB”);EntityManager manager = factory.createEntityManager();manager.getTransaction().begin();try {Usuario usuario = manager.remove(usuario);manager.getTransaction().commit();} catch (Exception e) {manager.getTransaction().rollback();} finally {manager.close();}factory.close();}
  24. 24. Listando objetospublic List<Usuario> lista () {EntityManagerFactory factory = Persistence.createEntityManagerFactory(“BESSAS_DB”);EntityManager manager = factory.createEntityManager();manager.getTransaction().begin();List<Usuario> usuarios = new ArrayList<Usuario>();try {Query query = manager.createQuery("SELECT u FROM Usuario u");usuarios = query.getResultList();manager.getTransaction().commit();} catch (Exception e) {manager.getTransaction().rollback();} finally {manager.close();}factory.close();}
  25. 25. Vamos melhorar o nosso projetoOpen Session in View
  26. 26. Classe JPAFilterpublic class JPAFilter implements Filter {private EntityManagerFactory factory;@Overridepublic void init(FilterConfig arg0) throws ServletException {this.factory = Persistence.createEntityManagerFactory("BESSAS_DB");}@Overridepublic void destroy() {this.factory.close();}@Overridepublic void doFilter(ServletRequest request, ServletResponse response,FilterChain chain) throws IOException, ServletException {// Implementação aqui...}}
  27. 27. Implementação do método doFilter@Overridepublic void doFilter(ServletRequest request, ServletResponse response,FilterChain chain) throws IOException, ServletException {EntityManager entityManager = this.factory.createEntityManager();request.setAttribute("EntityManager", entityManager);entityManager.getTransaction().begin();chain.doFilter(request, response);try {entityManager.getTransaction().commit();} catch (Exception e) {entityManager.getTransaction().rollback();} finally {entityManager.close();}}
  28. 28. Adicionando o método getEntity aclasse Usuarioprivate EntityManager getEntityManager () {HttpServletRequest request = ServletActionContext.getRequest();EntityManager manager = (EntityManager)request.getAttribute("EntityManager");return manager;}
  29. 29. Recebendo o entityManager no nossodaoprivate EntityManager manager;public UsuarioDAO (EntityManager manager) {this.manager = manager;}
  30. 30. Refatorando os métodos do DAOpublic void saveOrUpdate (Usuario usuario) {this.manager.persist(usuario);}public Usuario buscar(Integer id) {return this.manager.find(Usuario.class, 1);}public void remove(Usuario usuario) {manager.remove(usuario);}public List<Usuario> lista () {Query query = manager.createQuery("SELECT u FROM Usuario u");return query.getResultList();}
  31. 31. No controller@Overridepublic String execute() throws Exception {EntityManager manager = this.getEntityManager();UsuarioDAO dao = new UsuarioDAO(manager);dao.adiciona(this.usuario);return AdicionaUsuarioAction.SUCCESS;}
  32. 32. Relacionamentos@OneToOne@OneToMany@ManyToOne@ManyToMany
  33. 33. @OneToOne@JoinColumn ( name =" gov_id ")O Padrão seria “governador_id”
  34. 34. @OneToMany
  35. 35. @ManyToOne@JoinColumn ( name =” cli_id ")O Padrão seria “cliente_id”
  36. 36. @ManyToMany@JoinTable ( name =" Liv_Aut ",joinColumns = @JoinColumn ( name =" Liv_ID "),inverseJoinColumns = @JoinColumn ( name =" Aut_ID "))private Collection <Autor > autores ;O Padrão seria “livro_autor”
  37. 37. Lazy e Eager@Basic(fetch=FetchType.LAZY)@ManyToOne ( fetch = FetchType . LAZY )Define que a propriedade não deve ser trazida dobanco no mesmo momento em que o Objeto.@Basic(fetch=FetchType.EAGER)@OneToOne ( fetch = FetchType . EAGER)Define que a propriedade deve ser trazida do bancono mesmo momento em que o Objeto.
  38. 38. HerançaSingle Table@Inheritance(strategy=InheritanceType.SINGLE_TABLE)Joined@Inheritance ( strategy = InheritanceType . JOINED )Table Per Class@Inheritance ( strategy = InheritanceType .TABLE_PER_CLASS )
  39. 39. Herança@Entitypublic class Pessoa {@Id @GeneratedValueprivate Long id;private String nome ;// GETTERS E SETTERS}Suponha que tenhamos as classes abaixo:@Entitypublic class PessoaJuridica extendsPessoa {private String cnpj ;// GETTERS E SETTERS}@Entitypublic class PessoaFisica extends Pessoa{private String cpf ;// GETTERS E SETTERS}
  40. 40. HerançaSingle Table@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
  41. 41. HerançaJoined@Inheritance ( strategy = InheritanceType .JOINED )
  42. 42. HerançaTable Per Class@Inheritance ( strategy = InheritanceType .TABLE_PER_CLASS )
  43. 43. JPQLJava Persistence Query LanguageQuery query = manager . createQuery ( “SELECT u FROM Usuario”);
  44. 44. JPQLPaginaçãoquery . setFirstResult (10) ;query . setMaxResults (20) ;
  45. 45. JPQLOperadores<>ANDORMEMBER OFBETWEENIS EMPTYEtc…
  46. 46. GERANDO O BANCO DE DADOS
  47. 47. GERANDO AS TABELAS<property name="hibernate.hbm2ddl.auto" value="update" /><property name="hibernate.hbm2ddl.auto" value=”create" />
  48. 48. Algumas recomendações
  49. 49. Estude inglês desde cedo.Fluência necessita tempo e prática.
  50. 50. Independente da linhaque você seguir(técnica, teórica,acadêmica).O importante é vocênão ser simplesmentebom, mas o melhornaquilo que você faz.Busque excelência técnica...
  51. 51. Fique atento para oportunidades, mesmo que nãosejam exatamente o que você esperava. Pense nosresultados a longo prazo.
  52. 52. Não tenhamedo deerrar.Na vida vocêaprende maiscom os errosdo que comos acertos.
  53. 53. Thanks a lot!Fernando Oliveiranandooliveira.al@gmail.comSkype: nandooliveira3

×