ManyToMany to ManyToMany (sql de 4 joins)

9 respostas
filipesg

Olá pessoal, bom dia.
Estou tentando colocar uma lista de METODOS no bean USUARIO.
O que fiz até agora é colocar uma lista de GRUPOS no bean USUARIO.
Se estivesse fazendo sem o hibernate eu faria uma sql com 4 joins (USUARIO join USUARIO_GRUPO join GRUPO join METODO_GRUPO join METODO).
Segue a estrutura do banco e os beans implementados ate agora.

USUARIO
*cpf
nome
(quero colocar uma lista de METODOS aqui)
...

USUARIO_GRUPO
*codigo
cpf_usuario
codigo_grupo

GRUPO
*codigo
descricao

METODO_GRUPO
*codigo
codigo_metodo
codigo_grupo

METODO
*codigo
nome
...

USUARIO:
@Entity
@Table(name = "usuario", schema = "seguranca")
public class Usuario implements BeanCrud {
	private static final long serialVersionUID = 1L;

	@Id
	private String cpf;
	private String nome;
	@ManyToMany(fetch=FetchType.EAGER, targetEntity=Grupo.class)
	@JoinTable(name="usuario_grupo", schema="seguranca",
		joinColumns=@JoinColumn(name="cpf_usuario", referencedColumnName="cpf"),
		inverseJoinColumns=@JoinColumn(name="codigo_grupo", referencedColumnName="codigo"))
	@IndexColumn(name="codigo")
	private List<Grupo> grupos;
GRUPO:
@Entity
@Table(name = "grupo", schema = "seguranca")
public class Grupo {
	@Id
	private Integer codigo;
	private String descricao;
METODO:
@Entity
@Table(name = "metodo", schema = "seguranca")
public class Metodo {
	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	private Integer codigo;
	private String nome;
Qual seriam as formas de fazer isso?

9 Respostas

CristianPalmaSola10

Voce adicionou uma lista de grupos para um usuario agora voce tera que adicionar uma lista de metodos ao grupo

e ai por fim voce faa um select para carregar os grupos do usuario e para cada grupo fara um select para trazer os metodos do grupo

filipesg

CristianPalmaSola10:
Voce adicionou uma lista de grupos para um usuario agora voce tera que adicionar uma lista de metodos ao grupo

e ai por fim voce faa um select para carregar os grupos do usuario e para cada grupo fara um select para trazer os metodos do grupo

Ok, eu entendi isso, mas eu queria uma lista de METODOS no bean USUARIO, seria muuuuito mais prático para a minha aplicação. É possível?

filipesg

E se eu criar uma lista de METODO no bean USUARIO sem mapeamento e preencher manualmente depois do load do USUARIO?
Agrupar todos as listas de METODOS de todos os GRUPOS e armazenar na lista de METODOS no USUARIO?
Existe alguma anotação para o hibernate não mapear determinado atributo?

CristianPalmaSola10

Eu acho que fazer o select e colocar em uma propriedade Transient do bean Usuario é uma boa saida

se não for assim para ter essa lista no usuario, voce teria que tirar o bean grupo, e para cada usuario dar as mesmas permisoes.

a propriedade transient deixando todo o resto como esta no meu ponto de vista é a melhor opção entre as que apareceram ate agora

P

Vc já tem os METODOS atraves do GRUPO, é questão de navegar nos objetos.

filipesg

Mas isso é um controle de acesso, vc acha então que a cada requisição eu devo navegar varias listas procurando por um objeto ao invés de armazenar tudo em uma lista só na hora do login e no acesso procurar em uma unica lista?
Se não tem como fazer do jeito q eu queria com hibernate td bem, mas eu não vou deixar essa estrutura que fica na sessão do usuário toda bagunçada e cheia de informação desnecessária.

Como eu faria isso? Um query HQL com todos os 4 joins? Como faria pra setar a propriedade @Transient?

CristianPalmaSola10

Voce naum faria uma query impossivel nesse casso, teria que fazer mais de uma query

propriedade transient

@Transient
private List&lt;Metodo&gt; listaMetodo;

e depois varias os selects necessarios para popular os objetos

filipesg

Está aqui o melhor que eu consegui fazer, se alguém tiver alguma ideia melhor por favor avisa.

UsuarioDao:
public Usuario carregar(Usuario usuario) {
		String sql;

		usuario = (Usuario)session.load(Usuario.class, usuario.getCpf());

		sql =	"select m.codigo " +
				"from metodo as m " +
					"join metodo_grupo as mg on m.codigo = mg.codigo_metodo " +
					"join grupo as g on mg.codigo_grupo = g.codigo " +
					"join usuario_grupo as ug on g.codigo = ug.codigo_grupo " +
				"where ug.cpf_usuario = '" + usuario.getCpf() + "'";
		usuario.setMetodos(session.createSQLQuery(sql).addEntity(Metodo.class).list());

		return usuario;
	}
CristianPalmaSola10

Eu acho que ta bom assim, funcionou entaum ta beleza

Criado 3 de agosto de 2012
Ultima resposta 6 de ago. de 2012
Respostas 9
Participantes 3