Home Relacionamentos na JPA - Jakarta EE
Post
Cancelar

Relacionamentos na JPA - Jakarta EE

Baseado nos cursos da Softblue

Relacionamentos em JPA

• O JPA é capaz de trabalhar com relacionamentos entre entidades

– Em orientação a objetos, um relacionamento existe quando um objeto da classe A possui um atributo que referencia um objeto B, de outra classe

– No modelo relacional, um relacionamento existe quando uma tabela A referencia uma tabela B através de uma chave estrangeira (foreign key)

Exemplo na Orientação a Objetos

Exemplo na Orientação a Objetos

Exemplo no Modelo Relacional

Definindo Relacionamentos

• Os relacionamentos são definidos nas entidades através de anotações

AnnotationTipo de Relacionamento
@OneToOneUm-para-Um
@OneToManyUm-para-Muitos
@ManyToOneMuitos-para-Um
@ManyToManyMuitos-para-Muitos

• Outras anotações utilizadas em relacionamentos

AnnotationTipo de Relacionamento
@JoinColumnColuna para chave estrangeira
@JoinTableTabela auxiliar para o join

pedido.java

1
2
3
4
5
6
7
8
9
10
11
12
13
@OneToOne
@JoinColumn(name = "pagamento_id")
private Pagamento pagamento;

@ManyToOne
@JoinColumn(name = "cliente_id", nullable = false)
private Cliente cliente;

@ManyToMany
@JoinTable(name = "PEDIDO_PRODUTO", 
  joinColumns = @JoinColumn(name = "pedido_id"),
  inverseJoinColumns = @JoinColumn(name = "produto_id"))
private List<Produto> produtos;

• Relacionamentos unidirecionais

– É possível navegar do lado A para o B

– Não é possível navegar do lado B para o A

• Relacionamentos bidirecionais

– É possível navegar do lado A para o B

– É possível navegar do lado B para o A

Relacionamento Bidirecional

Relacionamento Unidirecional

Dono do Relacionamento

• Em relacionamentos bidirecionais, um dos lados do relacionamento é o dono do relacionamento (relationship owner)

TipoDono
Um-para-UmLado que possui a chave estrangeira (foreign key)
Um-para-MuitosLado “muitos”
Muitos-para-UmLado “muitos”
Muitos-para-MuitosA critério da aplicação

Dono do Relacionamento

Muitos-Para-Muitos

Relacionamentos Eager e Lazy

• Quando uma entidade que possui relacionamentos é carregada, a JPA permite duas abordagens

– Carregar automaticamente as entidades dos relacionamentos (EAGER)

– Carregar os relacionamentos apenas quando eles forem necessários (LAZY)

– A JPA assume um padrão

• @OneToOne e @ManyToOne = EAGER

• @OneToMany e @ManyToMany = LAZY

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class Pedido {
  @OneToOne(fetch = FetchType.EAGER)//O pagamento será carregado automaticamente
  private Pagamento pagamento;

public class Pedido {
  @OneToOne(fetch = FetchType.LAZY)//O pagamento não será carregado automaticamente, Será carregado apenas quando for utilizado
  private Pagamento pagamento;

public class Cliente {
  @OneToMany(fetch = FetchType.EAGER)//Os pedidos serão carregados automaticamente
  private List<Pedido> pedidos;

public class Cliente {
  @OneToMany(fetch = FetchType.LAZY)//Os pedidos não serão carregados automaticamente. Serão carregados apenas quando forem utilizados
  private List<Pedido> pedidos;

• Entre EAGER ou LAZY, não existe uma opção melhor ou pior

– Vai depender de cada situação

• EAGER

– Reduz o acesso ao banco de dados para leitura de dados

– Ocupa mais memória

• LAZY

– É preciso fazer vários acessos ao banco de dados para obter os dados conforme a necessidade

– Ocupa menos memória

Esta postagem está licenciada sob CC BY 4.0 pelo autor.