JPA Lazy buscar chave estrangeira

4 respostas
jpa
M
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "ESPECIALIDADEID", referencedColumnName = "ESPECIALIDADEID")    
private Especialidade especialidade;

Parece coisa a toa, mas não consegui encontrar resposta simples, talvez não esteja sabendo perguntar. Tenho uma entidade PESSOA com um campo ESPECIALIDADEID.

1. Quando preciso somente da tabela principal faço a pesquisa com JPA e funciona certo, a especialidade vem null e não faz o join no sql
2. Quando quero a especialidade, instancio o atributo daí ele faz o join e traz o objeto
3. O problema é quando quero buscar o id da especialidade sem precisar fazer join. EspecialidadeId na tabela pessoa. Se tento buscar pelo objeto, ele está null. Se dou o new, ele faz o join na tabela. Como eu tenho que fazer pra buscar o campo ESPECIALIDADEID sem precisar fazer o join?

4 Respostas

J

Não é coisa a toa, você está certo, pois é desperdício fazer join nesse caso.

Então o JPA/Hibernate faz join se você só acessar o id da especialidade? Se faz join e o mapeamento tiver correto isso é péssimo, tem que haver uma solução na ferramenta. Daqui a pouco deve vir algum especialista em JPA pra te passar uma solução ideal, mas se eu tivesse num projeto desse sendo obrigado a usar JPA sem ter alguém experiente pra ajudar e sem achar solução, mapearia o id de Especialidade diretamente na classe Pessoa. Horrível né? Então considere isso só em último caso, ou nem considere rs. Só sei que escrevendo SQL diretamente é muito mais prático, eficiente e sem esses mistérios.

M

Pois é, também pensei nessa saída. Ter a especialidadeid mapeada individualmente e também mapeado como objeto. Mas duvido que seja a melhor solução.

Você utiliza SQL direto nas suas aplicações?

J

Utilizo SQL diretamente e biblioteca mínima só para ajudar em partes que seriam repetitivas. Mas no momento não trabalho na plataforma Java, e sim no .Net, embora sigam quase a mesma linha.

Se você está estudando para entrar no mercado, não tem como fugir de JPA/Hibernate pois o mercado pede bastante, usam independente do seu custo, por ser padrão e facilitar quem segue modelagem orientada a objetos, por mais que se use um banco de dados relacional. Isso de fazer join a toa só pra pegar esse id que está na própria tabela deve ser comum no mercado usando essa ferramenta, então relaxa e siga seus estudos conforme livros e cursos.

Como saída em último caso você também pode usar SQL diretamente dentro do Hiberante.

M

Encontrei o problema e resolvi postar pra ficar documentado caso alguem enfrente o mesmo problema. O relacionamento lazy precisou ser criado da seguinte forma

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "PACIENTEID", insertable = true, updatable = false)
private Paciente paciente;

o segredo está na parte , insertable = true, updatable = false. Como não criei o ‘caminho inverso’ na tabela Paciente, preciso colocar esses dois parâmetros. Agora, quando preciso montar a query jpa pra filtrar por paciente uso
Predicate predicate = local.get(“paciente”).get(“pacienteId”).in(paciente.getPacienteId());

Ele ‘sabe’ que não precisa fazer join na tabela Paciente. Quando precisar de buscar outras informações da tabela paciente eu preciso em algum momento dar new Paciente() no objeto pra que ele entenda que preciso do Join, mas acredito que deve existir uma forma dele entender isso automático. Mas no momento da forma que está resolveu.

Criado 16 de novembro de 2016
Ultima resposta 3 de mar. de 2017
Respostas 4
Participantes 2