Dúvida: Critéria e ManytoMany

4 respostas
T

Bom dia!!!

Eu tenho uma classe Manutenção:

public class Manutencao implements Serializable{

private Set<Servidor> servidor;


@ManyToMany(fetch=FetchType.LAZY)
	@JoinTable(name="manutencao_servidor",
				joinColumns={@JoinColumn(name="fk_manutencao")},
				inverseJoinColumns={@JoinColumn(name="fk_servidor")})
	public Set<Servidor> getServidor() {
		return servidor;
	}
	public void setServidor(Set<Servidor> servidor) {
		this.servidor = servidor;
	}

Fazendo isso ele cria uma tabela "manutencao_servidor". Até aí funciona blz!

O problema é na critéria, como eu faço para listar todas as manutenções de um servidor?

@SuppressWarnings("unchecked")
	public List<Manutencao> pesquisaManu(){
		Criteria cri = session.createCriteria(Manutencao.class);
		cri.add(Restrictions.eq("servidor", 1L));
		return cri.list(); 
	}
Esta critéria acima funcionaria para mapeamento @ManyToOne.

Teria fazer isso na critéria, ao invés de um sql ou hql?

Desde de já agradeço a atenção e ajuda de todos.

Um Abraço,

Tubarão

4 Respostas

_fs

Porque não declara o ManyToMany no servidor também?

T

Boa tarde!!!

Lipe, vc está falando para mapear a classe servidor também, para questão de navegação?

Pode ser assim?

Classe Servidor {

private List<Manutencao> manutencoes;

@ManyToMany
	public List<Manutencao> getManutencoes() {
		return manutencoes;
	}
	public void setManutencoes(List<Manutencao> manutencoes) {
		this.manutencoes = manutencoes;
	}
}

Andei pesquisando um pouco e encontrei algo parecido com esta critéria aqui. Testei e funciona! Não se se está certo!

@SuppressWarnings("unchecked")
	public List<Manutencao> pesquisaManu(Servidor server){
		Criteria cri = session.createCriteria(Manutencao.class);
			//server.setId(3L);
			cri = cri.createCriteria("servidor");
			cri.add(Restrictions.eq("id", server.getId()));
			System.out.println("Valor da lista:::::::" + cri.list().size());
			
		return cri.list(); 
	}

Desde de já, agradeço a sua atenção e ajuda!!!!

Tubarão

_fs

Ao mapear da forma adequada, para pegar a coleção de Manutenções de um Servidor, bastaria

Servidor servidor = ( Servidor ) session.get( Servidor.class, 1L );
List< Manutencao > manutencoes = servidor.getManutencoes();

certo? ;D

T

Bom dia!

Lipe, valeu d+ deu certo, e ficou muito elegante a pesquisa…

Só alterei o manytomany da classe Servidor para a collection de manutenções, para ele não criar um novo mapeamento na hora de gerar o banco pelo hibernate.

@ManyToMany(fetch=FetchType.LAZY, mappedBy="servidor")
	public Set<Manutencao> getManutencoes() {
		return manutencoes;
	}
	public void setManutencoes(Set<Manutencao> manutencoes) {
		this.manutencoes = manutencoes;
	}

Classe manutenção:

@ManyToMany(fetch=FetchType.LAZY)
	@JoinTable(name="ctbc_datac_manutencao_servidor",
				joinColumns={@JoinColumn(name="fk_manutencao")},
				inverseJoinColumns={@JoinColumn(name="fk_servidor")})
	public Set<Servidor> getServidor() {
		return servidor;
	}
	public void setServidor(Set<Servidor> servidor) {
		this.servidor = servidor;
	}

Muito obrigado, valeu…

Criado 6 de setembro de 2007
Ultima resposta 11 de set. de 2007
Respostas 4
Participantes 2