Tentando fazer um save e update ao msm tempo com Hibernate?

0 respostas
fernandopaiva

Salve galera, é o seguinte, estou a dias tentando achar uma solução para meu problema…Não consigo fazer o que preciso, se puderem dar umas dicas agradeço…

É o seguinte, eu tenho um cadastro de permissoes, nesse cadastro eu tenho uma JTable que permite associar um perfil a seus modulos de permissoes, e assim dar as permissoes: Inserir, Alterar, Consultar e Imprimir.

Postei a tela que estou falando.

Tudo funciona bem usando o merge(), porem o merge soh atualiza o que ja tem não insere outros registros. Eu preciso que quando não exista o registro, eu consiga inseri-lo gerando assim um novo registro para o perfil com o modulo novo.

Estou tentando usar saveOrUpdate(), mas não estou conseguindo fazer e ainda estou tendo o seguinte erro:

Exception occurred during event dispatching:
org.hibernate.NonUniqueObjectException: a different object with the same identifier value was already associated with the session: [classesbd.Yperfilmodulo#41]
	at org.hibernate.engine.StatefulPersistenceContext.checkUniqueness(StatefulPersistenceContext.java:590)
	at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.performUpdate(DefaultSaveOrUpdateEventListener.java:284)
	at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.entityIsDetached(DefaultSaveOrUpdateEventListener.java:223)
	at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.performSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:89)
	at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:70)
	at org.hibernate.impl.SessionImpl.fireSaveOrUpdate(SessionImpl.java:507)
	at org.hibernate.impl.SessionImpl.saveOrUpdate(SessionImpl.java:499)
	at org.hibernate.impl.SessionImpl.saveOrUpdate(SessionImpl.java:495)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	at java.lang.reflect.Method.invoke(Method.java:597)
	at org.hibernate.context.ThreadLocalSessionContext$TransactionProtectionWrapper.invoke(ThreadLocalSessionContext.java:301)
	at $Proxy0.saveOrUpdate(Unknown Source)
	at controlpanelforms.ModulosPermissoesForm.alteraVinculaPerfilModuloPermissoes(ModulosPermissoesForm.java:1021)
	at controlpanelforms.ModulosPermissoesForm.btnAlterar1ActionPerformed(ModulosPermissoesForm.java:829)
	at controlpanelforms.ModulosPermissoesForm.access$1100(ModulosPermissoesForm.java:46)
	at controlpanelforms.ModulosPermissoesForm$14.actionPerformed(ModulosPermissoesForm.java:604)
	at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1995)
	at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2318)
	at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387)
	at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242)
	at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:236)
	at java.awt.Component.processMouseEvent(Component.java:6288)
	at javax.swing.JComponent.processMouseEvent(JComponent.java:3267)
	at java.awt.Component.processEvent(Component.java:6053)
	at java.awt.Container.processEvent(Container.java:2041)
	at java.awt.Component.dispatchEventImpl(Component.java:4651)
	at java.awt.Container.dispatchEventImpl(Container.java:2099)
	at java.awt.Component.dispatchEvent(Component.java:4481)
	at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4577)
	at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4238)
	at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4168)
	at java.awt.Container.dispatchEventImpl(Container.java:2085)
	at java.awt.Window.dispatchEventImpl(Window.java:2478)
	at java.awt.Component.dispatchEvent(Component.java:4481)
	at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:643)
	at java.awt.EventQueue.access$000(EventQueue.java:84)
	at java.awt.EventQueue$1.run(EventQueue.java:602)
	at java.awt.EventQueue$1.run(EventQueue.java:600)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:87)
	at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:98)
	at java.awt.EventQueue$2.run(EventQueue.java:616)
	at java.awt.EventQueue$2.run(EventQueue.java:614)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:87)
	at java.awt.EventQueue.dispatchEvent(EventQueue.java:613)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
	at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
	at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:178)
	at java.awt.Dialog$1.run(Dialog.java:1046)
	at java.awt.Dialog$3.run(Dialog.java:1098)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.awt.Dialog.show(Dialog.java:1096)
	at java.awt.Component.show(Component.java:1584)
	at java.awt.Component.setVisible(Component.java:1536)
	at java.awt.Window.setVisible(Window.java:842)
	at java.awt.Dialog.setVisible(Dialog.java:986)
	at classesdecontrole.AbreDialog.abreDialog(AbreDialog.java:9)
	at controlpanelforms.PrincipalForm.jButton2ActionPerformed(PrincipalForm.java:269)
	at controlpanelforms.PrincipalForm.access$300(PrincipalForm.java:38)
	at controlpanelforms.PrincipalForm$3.actionPerformed(PrincipalForm.java:152)
	at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1995)
	at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2318)
	at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387)
	at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242)
	at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:236)
	at java.awt.AWTEventMulticaster.mouseReleased(AWTEventMulticaster.java:272)
	at java.awt.Component.processMouseEvent(Component.java:6288)
	at javax.swing.JComponent.processMouseEvent(JComponent.java:3267)
	at java.awt.Component.processEvent(Component.java:6053)
	at java.awt.Container.processEvent(Container.java:2041)
	at java.awt.Component.dispatchEventImpl(Component.java:4651)
	at java.awt.Container.dispatchEventImpl(Container.java:2099)
	at java.awt.Component.dispatchEvent(Component.java:4481)
	at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4577)
	at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4238)
	at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4168)
	at java.awt.Container.dispatchEventImpl(Container.java:2085)
	at java.awt.Window.dispatchEventImpl(Window.java:2478)
	at java.awt.Component.dispatchEvent(Component.java:4481)
	at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:643)
	at java.awt.EventQueue.access$000(EventQueue.java:84)
	at java.awt.EventQueue$1.run(EventQueue.java:602)
	at java.awt.EventQueue$1.run(EventQueue.java:600)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:87)
	at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:98)
	at java.awt.EventQueue$2.run(EventQueue.java:616)
	at java.awt.EventQueue$2.run(EventQueue.java:614)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:87)
	at java.awt.EventQueue.dispatchEvent(EventQueue.java:613)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
	at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
	at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:178)
	at java.awt.Dialog$1.run(Dialog.java:1046)
	at java.awt.Dialog$3.run(Dialog.java:1098)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.awt.Dialog.show(Dialog.java:1096)
	at java.awt.Component.show(Component.java:1584)
	at java.awt.Component.setVisible(Component.java:1536)
	at java.awt.Window.setVisible(Window.java:842)
	at java.awt.Dialog.setVisible(Dialog.java:986)
	at controlpanelforms.PrincipalForm$7.run(PrincipalForm.java:292)
	at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209)
	at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:641)
	at java.awt.EventQueue.access$000(EventQueue.java:84)
	at java.awt.EventQueue$1.run(EventQueue.java:602)
	at java.awt.EventQueue$1.run(EventQueue.java:600)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:87)
	at java.awt.EventQueue.dispatchEvent(EventQueue.java:611)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
	at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
	at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)

Eu entendi o erro, de que esta tentando inserir um campo unico e tals, e ja existe. Porem, sendo assim deveria dar o Update.

Bem, não sei se é a maneira correta de se fazer isso, mas segue a maneira q estou tentando.

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 yperfilmodulo AS p WHERE p.idperfil = :idPerfil");
        query.addEntity(Yperfilmodulo.class);
        query.setParameter("idPerfil", codP);
        List<Yperfilmodulo> l = query.list();        

        Yperfil perfil = new Yperfil();
        perfil.setId(codP);
        for(int x = 0; x < gridPermissoesPorModulo.getRowCount(); x++){
            Yperfilmodulo perfilModulo = new Yperfilmodulo();
            perfilModulo.setId(l.get(x).getId());
            
            Ymodulos modulos = new Ymodulos();
            modulos.setId(Long.parseLong((String)gridPermissoesPorModulo.getValueAt(x, 0)));
            perfilModulo.setYperfil(perfil);
            perfilModulo.setYmodulos(modulos);            
            
            perfilModulo.setInserir(String.valueOf(gridPermissoesPorModulo.getValueAt(x, 2).toString()));
            perfilModulo.setAlterar(String.valueOf(gridPermissoesPorModulo.getValueAt(x, 3).toString()));
            perfilModulo.setConsultar(String.valueOf(gridPermissoesPorModulo.getValueAt(x, 4).toString()));
            perfilModulo.setImprimir(String.valueOf(gridPermissoesPorModulo.getValueAt(x, 5).toString()));                        
            sessao.saveOrUpdate(perfilModulo);
        }        
        sessao.getTransaction().commit();          
    }

Se alguém ae puder dar uma ajuda ou uma dica ou até msm uma maneira mais simples de se fazer isso, agradeço.

obrigado


Criado 12 de agosto de 2011
Respostas 0
Participantes 1