Baixe o app para aproveitar ainda mais
Prévia do material em texto
1 ALPOO ALPOO Aplicações de Linguagem de Programação Orientada a Objetos Prof. Me. Elisangela Sato 2023 2 ALPOO JPA – Hibernate – Spring Data JPA 3 ALPOO JPA • Jakarta Persistence API (Java Persistence API). • É uma especificação Java para o mapeamento Objeto- Relacional (ORM), que faz a persistência de classes Java para tabelas correspondentes em um banco de dados relacional. • Abstrai complexidades do mapeamento objeto- relacional. Uma aplicação usando JPA fornecerá meta- informações sobre como mapear os objetos para o banco de dados. 4 ALPOO Problema • Incompatibilidade de paradigma 5 ALPOO Entidade import jakarta.persistence.Entity; import jakarta.persistence.GeneratedValue; import jakarta.persistence.GenerationType; import jakarta.persistence.Id; import lombok.Getter; import lombok.Setter; @Entity public class Aluno { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Getter private int matricula; @Getter @Setter private String nome; @Getter @Setter private Date dataNascimento; public Aluno(String nome, Date dataNascimento) { this.nome = nome; this.dataNascimento = dataNascimento; } } 6 ALPOO Anotações JPA • @Entity: declara uma classe como uma entidade persistente e todos os seus atributos serão criados e persistidos automaticamente no BD. • @Id: declara a propriedade identificadora da entidade, que será mapeada como chave primária no BD. • @GeneratedValue: declara o tipo do identificador como atribuído, ou seja que será criado e associado à entidade antes de ser salvo no BD. • GenerationType.IDENTITY: cria uma coluna de chave primária especial auto incrementada que gera um valor numérico ao realizar o INSERT no BD. 7 ALPOO Relacionamentos entre Entidades • @OneToOne: uma instância de uma entidade relacionada a uma instância de outra entidade. • @OneToMany: uma instância de uma entidade relacionada a várias instâncias de outra entidade. • @ManyToOne: várias instâncias de uma entidade estão relacionadas a uma instância de outra entidade. • @ManyToMany: várias instâncias de uma entidade estão relacionadas a várias instâncias de outra entidade. 8 ALPOO Hibernate • Hibernate é a implementação mais popular do JPA. Ou seja, o JPA especifica o que deve ser feito e o Hibernate determina como deve ser feito. • Benefícios: • Produtividade: Elimina o trabalho repetitivo e garante foco no problema de negócio. • Manutenção: Menos linhas de código torna mais fácil a refatoração. • Desempenho: Disponibiliza otimizações prontas. • Independência de fornecedor: Reduz riscos na substituição de BD. 9 ALPOO Arquitetura Hibernate BD Relacional Aplicação Java Provedor JPA (Hibernate, EclipseLink, ...) API JDBC Driver JDBC 10 ALPOO Spring Data JPA • Projeto da família Spring que inclui capacidades adicionais à implementação JPA (Hibernate), tornando a camada de persistência ainda mais eficiente. • Promove a geração automática de classes de persistência com métodos padrão, dessa forma reduzindo ou eliminando o código e acelerando o desenvolvimento e mitigando a possibilidade de introdução de erros. • Spring Data JPA remove a necessidade do pattern DAO. 11 ALPOO Spring Data JPA import org.springframework.data.repository.CrudRepository; public interface AlunoRepository extends CrudRepository<Aluno, Integer>{ } 12 ALPOO Spring Data JPA ... Aluno aluno1 = new Aluno("Maria Silva", new GregorianCalendar(2000, 10, 12).getTime()); Aluno aluno2 = new Aluno("Jose Pereira", new GregorianCalendar(2000, 10, 12).getTime()); alunoRepository.save(aluno1); alunoRepository.save(aluno2); alunoRepository.findAll().forEach(System.out::println); ... 13 ALPOO Spring Data JPA • CrudRepository: Interface de persistência genérica que fornece as operações básicas do CRUD. Independe de tecnologia, podendo usar para bancos de dados JPA/relacionais ou também para BDs NoSQL. Através dela também podemos chamar métodos como save(), findAll() e findById(). • JpaRepository: Extensão de CrudRepository, oferece métodos específicos, como paginação e exclusão de registros em lote. 14 ALPOO Query Builder • Mecanismo do Spring Data JPA para construção de queries dinâmicas baseadas em nomes de métodos. findByMatriculaOrEmail(int matricula, String email) predicado prefixo de busca Fonte: https://docs.spring.io/spring-data/jpa/docs/2.5.2/reference//html/#appendix.query.return.types 15 ALPOO Query Builder public interface AlunoRepository extends JpaRepository<Aluno, Integer>{ Optional<Aluno> findByNome(String nome); List<Aluno> findByNomeLike(String nome); } ... private AlunoRepository alunoRepository; ... Aluno aluno = new Aluno("Maria Silva", new GregorianCalendar(2000, 10, 12).getTime()); alunoRepository.save(aluno); Aluno a1 = alunoRepository.findByNome("Maria Silva").get(); ... 16 ALPOO Query Builder ... List<Aluno> lista = alunoRepository.findByNomeLike("M%"); a1.setNome("Maria Souza"); alunoRepository.save(a1); Page<Aluno> pag = alunoRepository.findAll(PageRequest.of(0,5)); List<Aluno> listaPaginada = pag.getContent(); for (Aluno alunoPag : listaPaginada) { System.out.println(alunoPag.getNome()); } alunoRepository.deleteById(6); ... 17 ALPOO Exemplo relacionamento Many-To-Many @Entity public class Aluno { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private int matricula; @Getter @Setter private String nome; @ManyToMany @JoinTable( name = "aluno_disciplina", joinColumns = @JoinColumn(name = "matricula"), inverseJoinColumns = @JoinColumn(name = "codigo")) @Getter @Setter private List<Disciplina> disciplinas = new ArrayList<>(); } 18 ALPOO Exemplo relacionamento Many-To-Many @Entity public class Disciplina { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private int codigo; @Getter @Setter private String nome; @ManyToMany(mappedBy = "disciplinas") @Getter @Setter private List<Aluno> alunos = new ArrayList<>(); } 19 ALPOO Exemplo relacionamento Many-To-Many public interface AlunoRepository extends JpaRepository <Aluno, Integer> { } public interface DisciplinaRepository extends JpaRepository <Disciplina, Integer> { } 20 ALPOO Exemplo relacionamento Many-To-Many ... @Transactional public void cadastrarAlunoNaDisciplina() { Aluno aluno = new Aluno(); aluno.setNome(“Maria Silva"); Disciplina disciplina = new Disciplina(); disciplina.setNome("ALPOO"); alunoRepository.save(aluno); disciplinaRepository.save(disciplina); aluno.getDisciplinas().add(disciplina); disciplina.getAlunos().add(aluno); } ... 21 ALPOO Exemplo relacionamento Many-To-Many select * from aluno select * from disciplina select * from aluno_disciplina 22 ALPOO Bibliografia: Craig, Walls. Spring in Action. 6th Edition. United States: Manning Publications Co, 2023. Spring Framework API. Version 6.0.11. 13 jul, 2023. Disponível em: https://docs.spring.io/spring-framework/docs/current/javadoc- api/org/springframework/jdbc/core/JdbcTemplate.html. Acesso em: 21 ago, 2023. Catalin, Tudose. Java Persistence with Spring Data and Hibernate. United States: Manning Publications Co, 2022. Weissmann, Henrique L. Vire o jogo com Spring Framework. São Paulo: Casa do código. 2018.
Compartilhar