Persistência com JPA2 eHibernateFernando Oliveira
O que é persistência?
ModeloRelacionalCREATE TABLE user(id int not null primary key,name varchar(255) not null);CREATE TABLE post (id int not nu...
ORMObject-relational Mapping
JPAJava Persistence API
Onde baixar…http://www.hibernate.org/
ConfiguraçãoO Hibernate deve ser configurado noarquivo src/META-INF/persistence.xml
persistence.xml<?xml version="1.0" encoding="UTF-8" ?><persistence xmlns="http://java.sun.com/xml/ns/persistence"xmlns:xsi...
Mapeamento
@EntityDefine que a classe representa uma entidade dobanco de dados@Entitypublic class Usuario {...}
@TablePermite definir algumas configurações para asentidades mapeadas como por exemplo o nome databela:@Entity@Table(name=...
@IdIndica qual atributo da classe será mapeadocomo chave primária:@Entity@Table(name=“user”)public class Usuario {@Idpriva...
@GeneratedValueUsado junto com @Id para indicar que o id serágerado automaticamente:@Entity@Table(name=“user”)public class...
@ColumnDefine configurações das colunas:@Entity@Table(name=“user”)public class Usuario {@Id@GeneratedValue(generator = “id...
@TransientInforma que a propriedade não deve ser persistida:@Entity@Table(name=“user”)public class Usuario {@Id@GeneratedV...
Entity Manager
Obtendo um entityManagerpublic Usuario save (Usuario usuario) {EntityManagerFactory factory =Persistence.createEntityManag...
TransaçãoÉ uma sequência de operações num SGBD quesão tratadas como um bloco único e indivisível
Sincronização com o Banco de DadosÉ a propagação das remoções, alterações e inserções para obanco de dados.Ocorre quando c...
Ciclo de vida das Entidades
Persistindopublic void saveOrUpdate (Usuario usuario) {EntityManagerFactory factory =Persistence.createEntityManagerFactor...
Buscar objetopublic Usuario buscar (Integer id) {EntityManagerFactory factory = Persistence.createEntityManagerFactory(“BE...
Remover objetopublic Usuario remover (Usuario) {EntityManagerFactory factory =Persistence.createEntityManagerFactory(“BESS...
Listando objetospublic List<Usuario> lista () {EntityManagerFactory factory = Persistence.createEntityManagerFactory(“BESS...
Vamos melhorar o nosso projetoOpen Session in View
Classe JPAFilterpublic class JPAFilter implements Filter {private EntityManagerFactory factory;@Overridepublic void init(F...
Implementação do método doFilter@Overridepublic void doFilter(ServletRequest request, ServletResponse response,FilterChain...
Adicionando o método getEntity aclasse Usuarioprivate EntityManager getEntityManager () {HttpServletRequest request = Serv...
Recebendo o entityManager no nossodaoprivate EntityManager manager;public UsuarioDAO (EntityManager manager) {this.manager...
Refatorando os métodos do DAOpublic void saveOrUpdate (Usuario usuario) {this.manager.persist(usuario);}public Usuario bus...
No controller@Overridepublic String execute() throws Exception {EntityManager manager = this.getEntityManager();UsuarioDAO...
Relacionamentos@OneToOne@OneToMany@ManyToOne@ManyToMany
@OneToOne@JoinColumn ( name =" gov_id ")O Padrão seria “governador_id”
@OneToMany
@ManyToOne@JoinColumn ( name =” cli_id ")O Padrão seria “cliente_id”
@ManyToMany@JoinTable ( name =" Liv_Aut ",joinColumns = @JoinColumn ( name =" Liv_ID "),inverseJoinColumns = @JoinColumn (...
Lazy e Eager@Basic(fetch=FetchType.LAZY)@ManyToOne ( fetch = FetchType . LAZY )Define que a propriedade não deve ser trazi...
HerançaSingle Table@Inheritance(strategy=InheritanceType.SINGLE_TABLE)Joined@Inheritance ( strategy = InheritanceType . JO...
Herança@Entitypublic class Pessoa {@Id @GeneratedValueprivate Long id;private String nome ;// GETTERS E SETTERS}Suponha qu...
HerançaSingle Table@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
HerançaJoined@Inheritance ( strategy = InheritanceType .JOINED )
HerançaTable Per Class@Inheritance ( strategy = InheritanceType .TABLE_PER_CLASS )
JPQLJava Persistence Query LanguageQuery query = manager . createQuery ( “SELECT u FROM Usuario”);
JPQLPaginaçãoquery . setFirstResult (10) ;query . setMaxResults (20) ;
JPQLOperadores<>ANDORMEMBER OFBETWEENIS EMPTYEtc…
GERANDO O BANCO DE DADOS
GERANDO AS TABELAS<property name="hibernate.hbm2ddl.auto" value="update" /><property name="hibernate.hbm2ddl.auto" value=”...
Algumas recomendações
Estude inglês desde cedo.Fluência necessita tempo e prática.
Independente da linhaque você seguir(técnica, teórica,acadêmica).O importante é vocênão ser simplesmentebom, mas o melhorn...
Fique atento para oportunidades, mesmo que nãosejam exatamente o que você esperava. Pense nosresultados a longo prazo.
Não tenhamedo deerrar.Na vida vocêaprende maiscom os errosdo que comos acertos.
Thanks a lot!Fernando Oliveiranandooliveira.al@gmail.comSkype: nandooliveira3
Persistência com JPA e Hibernate
Persistência com JPA e Hibernate
Upcoming SlideShare
Loading in...5
×

Persistência com JPA e Hibernate

439

Published on

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

Published in: Technology, Business

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

×