Por favor, ajudem....Hibernate e saveOrUpdate()?

Primeiramente, quero me desculpar pelo “Titulo do Post”, sei que é errado, mas o desespero fala mais alto…Por isso eu peço ajuda a quem puder ajudar ae !!! E novamente, me desculpe os moderadores.

É o seguinte, eu tenho 3 tabelas no BD …
1 - Ymodulos
2 - Yperfil
3 - Yperfilmodulo.

na tabela 1, eu cadastro o nome do modulo(classe de tela JDialog), na 2 eu cadastro o perfil do usuario, e na 3 eu vinculo o codigo do perfil aos modulos e dou as permissoes.

aqui esta o link das imagens dos modelos.
http://www.4shared.com/photo/nlPOpMlz/modelo.html?
aqui a imagem do JDialog onde faco o vinculo
http://www.4shared.com/photo/QU-917GY/Captura_de_tela-2.html?

Bem, o problema é o seguinte, quando eu faço o vinculo na primeira vez, eu uso o session.save() e insiro as informações normalmente no BD…

O problema acontece quando eu cadastro um novo módulo. Após cadastrar o novo módulo, eu abro a tela de vinculos e vou dar as permissoes ao novo módulo que é exibido na JTable. E é este o problema, eu não consigo inserir o novo módulo, eu consigo apenas alterar os que ja estão vinculados ao perfil. Eu preciso inseri-lo tbm, mas não consigo isso. Estou tentando usar o saveOrUpdate(), que na documentação do Hibernate diz que insere ou altera um novo registro, mas comigo isso ainda naum funcionou.
No link da tela JDialog com o JTable vcs vão ver o que estou tentando fazer, e no link do modelo vcs vão ver o relacionamento das 3 tabelas.

aqui vai o codigo que estou tentando agora, ja testei muitos outros e ainda não consegui fazer funcionar.

public void alteraVinculaPerfilModuloPermissoes(){
        //este método deveria alterar as permissoes que o perfil ja possui  ou insere um novo modulo com as permissoes
        Long codP = Long.parseLong(codPerfil.getText());
        Session sessao = new RetornaSessaoHibernate().hibernateSession();
        sessao.beginTransaction();        
       
        Yperfilmodulo pm = new Yperfilmodulo();
        Yperfil perfil = new Yperfil();
        perfil.setId(codP);
        Ymodulos modulo = new Ymodulos();
        for(int x = 0; x < gridPermissoesPorModulo.getRowCount(); x++){            
            String codM = (String)gridPermissoesPorModulo.getValueAt(x, 0);
            modulo.setId(Long.parseLong(codM));
            pm.setYperfil(perfil);
            pm.setYmodulos(modulo);
            pm.setInserir(String.valueOf(gridPermissoesPorModulo.getModel().getValueAt(x, 2).toString()));
            pm.setAlterar(String.valueOf(gridPermissoesPorModulo.getModel().getValueAt(x, 3).toString()));
            pm.setConsultar(String.valueOf(gridPermissoesPorModulo.getModel().getValueAt(x, 4).toString()));
            pm.setImprimir(String.valueOf(gridPermissoesPorModulo.getModel().getValueAt(x, 5).toString()));            
            sessao.saveOrUpdate(pm); //aqui esta o problema, não consigo inserir um novo registro caso não haja.
        }
        sessao.getTransaction().commit();        
    }

Espero que me desculpem, e que me ajude quem puder.

obrigado

Estou tentando assim tbm.

aqui esta.

public void alteraVinculaPerfilModuloPermissoes(){
        //este método altera as permissoes que o perfil ja possui e insere mais modulos 
        Long codP = Long.parseLong(codPerfil.getText());
        Session sessao = new RetornaSessaoHibernate().hibernateSession();
        sessao.beginTransaction();
        SQLQuery query = sessao.createSQLQuery("SELECT * FROM yperfilmodulo AS perfilModulo WHERE perfilModulo.idperfil = :idPerfil");
        query.addEntity(Yperfilmodulo.class);
        query.setParameter("idPerfil", codP);
        List<Yperfilmodulo> listaPM = query.list();
        Yperfil perfil = new Yperfil();        
        perfil.setId(codP);        
        for(Yperfilmodulo pm : listaPM){            
            Ymodulos modulos = new Ymodulos();
            String codMod = (String) gridPermissoesPorModulo.getValueAt(listaPM.indexOf(pm), 0);
            modulos.setId(Long.parseLong(codMod));
            
            pm.setYperfil(perfil);
            pm.setYmodulos(modulos);            
            pm.setInserir(String.valueOf(gridPermissoesPorModulo.getValueAt(listaPM.indexOf(pm), 2).toString()));
            pm.setAlterar(String.valueOf(gridPermissoesPorModulo.getValueAt(listaPM.indexOf(pm), 3).toString()));
            pm.setConsultar(String.valueOf(gridPermissoesPorModulo.getValueAt(listaPM.indexOf(pm), 4).toString()));
            pm.setImprimir(String.valueOf(gridPermissoesPorModulo.getValueAt(listaPM.indexOf(pm), 5).toString()));
            sessao.get(Yperfilmodulo.class, pm.getId());
            sessao.saveOrUpdate(pm);            
        }
        sessao.getTransaction().commit();
    }
    

Ola,

Olhando por cima o problema esta na sua criação de yPerfil.

Ao inves de dar ‘new’ em um perfil, porque vc não o carrega da base?

Apos isso, se vc fez um bom mapeamento no hibernate, dentro do perfil existira uma lista de perfilModulo.
adicione a essa lista o seu novo modulo e salve o perfil.

Algo assim:

class Perfil {
 @OneToMany
 Set&lt;PerfilModulo&gt; modulos;
}

Opa Dyorgio, obrigado pela atenção.

Desculpe a ignorancia. Mas como assim pegando da base e salvar o perfil ???

obrigado

Ao inves de pegar os modulos do perfil :

"SELECT * FROM yperfilmodulo AS perfilModulo WHERE perfilModulo.idperfil = :idPerfil"

pegue o perfil:

"SELECT * FROM yperfil AS perfil WHERE dperfil = :idPerfil"

Com o perfil em mãos, vc deve ter uma mapeamento OneToMany dos modulos em uma Lista, ou Set.
Então adicione o novo modulo nessa lista e salve o perfil.

Opa Dyorgio, obrigado pela atenção

To tentando assim…

    public void alteraVinculaPerfilModuloPermissoes(){
        //este método altera as permissoes que o perfil ja possui  
        Long codP = Long.parseLong(codPerfil.getText());
        Session sessao = new RetornaSessaoHibernate().hibernateSession();
        sessao.beginTransaction();
        SQLQuery query = sessao.createSQLQuery("SELECT * FROM yperfil AS perfil WHERE perfil.id = :idPerfil");
        query.addEntity(Yperfil.class);
        query.setParameter("idPerfil", codP);
        List<Yperfil> perfil = query.list();                                
        for(Yperfil p : perfil){                               
            Yperfilmodulo permod = new Yperfilmodulo();        
            permod.setId(Long.parseLong(gridPermissoesPorModulo.getValueAt(perfil.indexOf(p), 0).toString()));
            permod.setInserir(String.valueOf(gridPermissoesPorModulo.getValueAt(perfil.indexOf(p), 2).toString()));
            permod.setAlterar(String.valueOf(gridPermissoesPorModulo.getValueAt(perfil.indexOf(p), 3).toString()));
            permod.setConsultar(String.valueOf(gridPermissoesPorModulo.getValueAt(perfil.indexOf(p), 4).toString()));
            permod.setImprimir(String.valueOf(gridPermissoesPorModulo.getValueAt(perfil.indexOf(p), 5).toString()));
            sessao.get(Yperfil.class, p.getId());                                    
            p.setYperfilmodulos(permod); //aqui o erro java.util.Set
            sessao.saveOrUpdate(p);
        }
        sessao.getTransaction().commit();
    }

[]s

Fernando, vc sabe o que é um Set? ou um List?

ambas são Collections do Java, do pacote java.util.

Voce não deve setar ela, vc deve adicionar o seu item nela.

p.getYperfilmodulos().add(permod);

Caso vc não tenha uma List ou um Set de modulos no seu perfil,
reveja o seu mapeamento do hibernate.

o looping que vc fez foi desnecessario tb, faça apenas :

Yperfil perfil = query.list().get(0); 

Vc deve tambem testar se houve retorno da query, pois na primeira vez não existira os perfil…
nesse caso vc cria o perfil com new mesmo…

List tudo bem, mas Set naum havia usado msm em Collection, esse foi o problema.
mas blz, muito obrigado ae…Consegui resolver !!!

t++ e vlw pela atenção.

Blz Fernando,

da proxima vez que vc tiver problemas/duvidas quanto a relacionamentos,
não esqueça de colar o fonte das suas entidades…
ai a gente consegue sair do “ACHO” e ver qual o problema “DE CERTEZA” :slight_smile:

#ficadica