Buscar

ALPOO_aula03_2

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.

Continue navegando