Boa tarde, tenho uma duvida, estou fazendo o curso de jpa com hibernate, e vi se eu não usar o JOIN fetch o hibernate busca automaticamente as tabelas relacionadas da consulta, como por exemplo.
@Entity
public class Venda {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private BigDecimal valorTotal;
private LocalDate dataVenda;
@OneToOne
@JoinColumn(name = "cliente_id")
private Cliente cliente;
@ManyToMany
@JoinColumn(name = "produto_id")
private List<Produto> produtos;
List<Venda> vendas = manager.createQuery("SELECT v FROM Venda v", Venda.class).getResultList();
Se eu fizer um select dessa maneira o meu resultado do console é o seguinte.
Hibernate: select venda0_.id as id1_4_, venda0_.cliente_id as cliente_4_4_, venda0_.dataVenda as dataVend2_4_, venda0_.valorTotal as valorTot3_4_ from Venda venda0_
Hibernate: select cliente0_.id as id1_0_0_, cliente0_.cpf as cpf2_0_0_, cliente0_.idade as idade3_0_0_, cliente0_.nome as nome4_0_0_ from Cliente cliente0_ where cliente0_.id=?
Aqui deu 2 select sendo que só busquei a minha venda, então se eu pensar em performance em um sistema, aqui está fazendo 2 busca no meu banco de dados, oque eu acho que não é uma boa coisa né? Se eu usar o JOIN FETCH
List<Venda> vendas = manager.createQuery("SELECT v FROM Venda v JOIN FETCH v.cliente c", Venda.class).getResultList();
o console é o seguinte.
Hibernate: select venda0_.id as id1_4_0_, cliente1_.id as id1_0_1_, venda0_.cliente_id as cliente_4_4_0_, venda0_.dataVenda as dataVend2_4_0_, venda0_.valorTotal as valorTot3_4_0_, cliente1_.cpf as cpf2_0_1_, cliente1_.idade as idade3_0_1_, cliente1_.nome as nome4_0_1_ from Venda venda0_ inner join Cliente cliente1_ on venda0_.cliente_id=cliente1_.id
Aqui percebi que ele fez o inner join e fez apenas uma busca no meu banco, claro que meu banco de dados é pequeno então das 2 maneira foi rapido o select, pensando em um banco em produção mesmo com uma lista grande, nesse caso, qual seria a melhor opção? A segunda certo?