Hibernate Many to Many

1 resposta
D

Tenho as tabelas no meu bd:

grupo_usuario

codigo  
descricao

permissao

codigo  
descricao

permissao_grupo_usuario

cod_grupo_usuario  
cod_permissao

GrupoUsuario

@ManyToMany  
      @JoinTable(name = "permissao_grupo_usuario",    
        joinColumns = { @JoinColumn(name = "cod_grupo_usuario")},  
        inverseJoinColumns={@JoinColumn(name="cod_permissao")}  
    )  
    private List<Permissao> permissoes;  
    .........

Permissao

@ManyToMany  
      @JoinTable(name = "permissao_grupo_usuario",    
        joinColumns = { @JoinColumn(name = "cod_permissao")},  
        inverseJoinColumns={@JoinColumn(name="cod_grupo_usuario")}  
    )  
    private List<GrupoUsuario> gruposUsuario;  
    ...........

Consigo listar todas as permissões de um determinado Grupo de Usuário fazendo o seguinte:

public List<Permissao> listarPorGrupoUsuario(GrupoUsuario grupoUsuario) {  
       Query c = session.createQuery("SELECT p FROM Permissao AS p " +  
             "INNER JOIN p.gruposUsuario g WHERE g.codigo = " +   
             grupoUsuario.getCodigo());  
       List<Permissao> beans = c.list();  
       return beans;  
    }

Agora queria saber o seguinte:
Na minha tela de cadastro de grupo de usuário, o cliente vai preencher o grupo de usuário e escolher as permissões que o grupo de usuário terá.
Como faço para salvar o grupo de usuário e salvar as permissões que ele escolheu na tabela “permissao_grupo_usuario”? Lembrando que não vai ser inserido nada na tabela de permissão, ela somente serve para pegar os módulos que o sistema tem. Por exemplo, meu cliente digitou o grupo de usuário e escolheu as permissões abaixo, então terá que salvar assim no banco:

Tabela grupo_usuario "codigo, descricao"
1 - Gerente

Tabela permissao_grupo_usuario "cod_grupo_usuario, cod_permissao"
1 - 1
1 - 2
1 - 3
1 - 5

Tentei fazer da seguinte maneira

GrupoUsuario g = new GrupoUsuario();
		g.setDescricao("Secretária");
		List<Permissao> pList = new ArrayList<Permissao>();
		Permissao p = new Permissao();
		p.setDescricao("Cadastro de Clientes");
		pList.add(p);
		Permissao p2 = new Permissao();
		p2.setDescricao("Relatório de Clientes");
		pList.add(p2);
		g.setPermissoes(pList);
		GrupoUsuarioController.salvar(g);

E me da o seguinte erro:

Hibernate: 
    insert 
    into
        grupo_usuario
        (descricao) 
    values
        (?)
Hibernate: 
    insert 
    into
        permissao_grupo_usuario
        (cod_grupo_usuario, cod_permissao) 
    values
        (?, ?)
27/11/2009 21:23:35 org.hibernate.event.def.AbstractFlushingEventListener performExecutions
SEVERE: Could not synchronize database state with session
org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: com.model.Permissao

Alguem ja passou por isso e conseguiu resolver?

1 Resposta

D

Resolvido, solução:

GrupoUsuario g = new GrupoUsuario();
		g.setDescricao("Secretária");

		Permissao p = new Permissao();
		p.setCodigo(1);
		p.setDescricao("Grupos de Usuário");

		Permissao p2 = new Permissao();
		p2.setCodigo(2);
		p2.setDescricao("Usuários");

		List<Permissao> pList = new ArrayList<Permissao>();
		pList.add(p);
		pList.add(p2);

		g.setPermissoes(pList);

		GrupoUsuarioController.salvar(g);
Criado 27 de novembro de 2009
Ultima resposta 28 de nov. de 2009
Respostas 1
Participantes 1