Dúvida com relacionamento e Hibernate

0 respostas
Vendramini87

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

Criado 3 de fevereiro de 2010
Respostas 0
Participantes 1