Tenho o seguinte relacionamento:
Departamento
public class Departamento
{
private Long id;
private String nome;
private Date dataCriacao;
private Date dataAlteracao;
private List<Recurso> cargos;
@OneToMany(targetEntity=Cargo.class, mappedBy="departamento")
@JoinColumn(name="fk_depId")
public List<Recurso> getCargos()
{
return cargos;
}
public void setCargos(List<Recurso> cargos)
{
this.cargos = cargos;
}
Cargo
public class Cargo implements Recurso
{
private Long id;
private String nome;
private double salarioBase;
private Date dataCriacao;
private Date dataAlteracao;
private Empresa empresa;
private Departamento departamento;
private List<Funcionario> funcionarios;
@OneToMany(targetEntity=Funcionario.class, mappedBy="cargo")
@JoinColumn(name="func_id")
public List<Funcionario> getFuncionarios()
{
return funcionarios;
}
public void setFuncionarios(List<Funcionario> funcionarios)
{
this.funcionarios = funcionarios;
}
Funcionario
public class Funcionario implements Recurso
{
private Long id;
private String nome;
private double salario;
private Date dataCriacao;
private Date dataAlteracao;
private Cargo cargo;
@ManyToOne(targetEntity=Cargo.class)
@JoinColumn(name="fk_cargoId")
@ForeignKey(name="cargo_id")
public Cargo getCargo()
{
return cargo;
}
public void setCargo(Cargo cargo)
{
this.cargo = cargo;
}
1- O relacionamento está correto? Departamento possui cargos e cargos possui muitos funcionarios (a interface Recurso foi necessária, pois tanto cargo como funcionário será encarado como recurso)
2- Da forma que está agora, trago do banco exatamente a quantidade de departamentos correta. Cinco, por exemplo. Quando mudo para fetch=FetchType.EAGER em Departamento, para trazer todos cargos e já trazer todos funcionários, por algum motivo ele duplica o departamento. Por exemplo: se existem 4 cargos no departamento Atendimento, o departamento aparece 4x na consulta
Consulta
public List<Departamento> listar()
{
Session session = HibernateUtil.getSessionFactory().getCurrentSession();
session.beginTransaction();
Criteria criteria = session.createCriteria(Departamento.class).addOrder(Order.asc("nome"));
return (List<Departamento>) criteria.list();
}
Será que deu pra entender?
Obrigado!
André Vendramini