Mapeamento Um para Muitos Oneroso

2 respostas
V

Oi Pessoal,

Boa noite.
Estou precisando de uma ajuda em Hibernate.

Tenho a relação de um para muitos entre departamento e empregados. Ela é implementada conforme abaixo:

//Na classe Departamento
@OneToMany
	@JoinColumn(name="id_empregado")
	private Set<Empregado> empregados;

O problema é que toda vez que quero adicionar ou remover um empregado, o código fica como abaixo:

departamento.getEmpregados().add(empregado);
departamento.getEmpregados().remove(empregado);

Ou seja, ele busca todos os empregados do banco para adicionar ou remover um.
Quando chamamos getEmpregados() e depois adicionamos, mesmo no modo LAZY, ele manda um select.
Não faz sentido ter um select a mais, quando basta apenas um insert ou delete. A medida que o banco vai crescendo, essa dupla e desnecessária operação se torna cada vez mais onerosa.

Alguém conhece alguma estratégia para contornar isto ?

Obrigado

2 Respostas

J2Alex

O melhor seria você inverter o seu processo:

empregado.setDepartamento(departamento);
C

Ou, quem sabe

departamento.adicionaEmpregado(empregado);
...
...
public class Departamento {
    public void adicionaEmpregado(Empregado e) {
           //não sei o seu código, mas a idéia seria essa
           hibernate.execute("insert into DepartamentoEmpregado(dep, emp) values(:dep, :emp)", new Object[] {this, e});
    }
}

edit: mas, quero deixar claro que sou a favor de inverter a navegação

Criado 29 de novembro de 2009
Ultima resposta 30 de nov. de 2009
Respostas 2
Participantes 3