Bom dia, tenho tres tabelas que se relacionam da seguinte forma:
Tabelas: Casa, Porta e Janela
Então crio dentro da tabela ‘Casa’ um objeto ‘Porta’ e um objeto ‘Janela’, mais ou menos assim:
...
private Porta porta;
private Janela janela;
...
Desta forma, na tabela ‘Casa’ cria-se dois parametros, que são eles: ‘porta_id’ e ‘janela_id’
Até esta parte não tenho nenhum problema ao salvar novas informações no banco, mas quando faço um SELECT por id na tabela casa, percebo que o hibernate monta um join com as tabelas ‘Porta’ e ‘Janela’
Como faço para evitar este join em outras tabelas?
Como está o seu relacionamento? tente usar o FetchType.LAZY. Ele faz a consultar trazer o objeto apenas se for necessário.
Ex:
@ManyToOne(fetch=FetchType.LAZY)
private Porta porta;
ok, vamos supor que eu tivesse 10 tabelas, ‘tabela01’,‘tabela02’,‘tabela03’,‘tabela04’,‘tabela05’,‘tabela06’,‘tabela07’,‘tabela08’,‘tabela09’,‘tabela10’.
E que a tabela01 crio um objeto da tabela02 e na tabela02 crio um objeto na tabela03 e assim por diante, quando eu fizer uma busca por id na tabela01, o hibernate ira fazer o join em todas as tabelas?
Sim. Pelos testes que já fiz o hibernate traz todos os objetos associados ao objeto que está buscando e assim para cada um deles, para impedir isso que é usado FetchType.LAZY.
Entendi, eu posso usar o fetch em qualquer anotação de relacionamento? por exemplo: @OneToOne, @OneToMany e @ManyToOne?
Teoricamente pode, mas em alguns casos o Hibernate lança uma exceção, então você é obrigado a usar a forma padrão que é fetch=FetchType.EAGER.Só não sei te dar exemples destes casos.
Caso eu tenha uma aplicação com 30 tabelas relacionadas entre si e eu não use a anotação do fetch, a performance do meu sistema estara comprometida?
caso seu sistema seja WEB utilize o padrão OSV ok!!!
Desculpe minha ignorancia, mas o que é OSV?