Executando Update com Hibernate?

3 respostas
fernandopaiva

Salve galera, estou precisando executar um update com o Hibernate, mas como sou iniciante não estou conseguindo. Estou tentando usar alguns exemplos que encontrei pela internet mas msm assim não vai.

exemplos:
http://www.java2s.com/Code/Java/Hibernate/UpdateHQL.htm
http://www.mkyong.com/hibernate/hibernate-query-examples-hql/

Estou tentando fazer assim:

//classe que retorna a sessao do hibernate
package classesdecontrole;
import org.hibernate.Session;
import util.HibernateUtil;

public class RetornaSessaoHibernate{
     public Session hibernateSession(){
        Session sessao = HibernateUtil.getSessionFactory().getCurrentSession();    
        return sessao;
    }
}


//classe mapeada
package classesbd;
// Generated Aug 2, 2011 3:38:17 PM by Hibernate Tools 3.2.1.GA

import java.util.HashSet;
import java.util.Set;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import static javax.persistence.GenerationType.IDENTITY;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.Table;

/**
 * Yperfil generated by hbm2java
 */
@Entity
@Table(name="yperfil"
    ,catalog="ibgdb"
)
public class Yperfil  implements java.io.Serializable {


     private Long id;
     private String perfil;
     private String observacao;
     private Set yusuarioses = new HashSet(0);
     private Set yperfilmodulos = new HashSet(0);

    public Yperfil() {
    }

	
    public Yperfil(String perfil) {
        this.perfil = perfil;
    }
    public Yperfil(String perfil, String observacao, Set yusuarioses, Set yperfilmodulos) {
       this.perfil = perfil;
       this.observacao = observacao;
       this.yusuarioses = yusuarioses;
       this.yperfilmodulos = yperfilmodulos;
    }
   
     @Id @GeneratedValue(strategy=IDENTITY)
    
    @Column(name="id", unique=true, nullable=false)
    public Long getId() {
        return this.id;
    }
    
    public void setId(Long id) {
        this.id = id;
    }
    
    @Column(name="perfil", nullable=false, length=50)
    public String getPerfil() {
        return this.perfil;
    }
    
    public void setPerfil(String perfil) {
        this.perfil = perfil;
    }
    
    @Column(name="observacao", length=50)
    public String getObservacao() {
        return this.observacao;
    }
    
    public void setObservacao(String observacao) {
        this.observacao = observacao;
    }
@OneToMany(cascade=CascadeType.ALL, fetch=FetchType.LAZY, mappedBy="yperfil")
    public Set getYusuarioses() {
        return this.yusuarioses;
    }
    
    public void setYusuarioses(Set yusuarioses) {
        this.yusuarioses = yusuarioses;
    }
@OneToMany(cascade=CascadeType.ALL, fetch=FetchType.LAZY, mappedBy="yperfil")
    public Set getYperfilmodulos() {
        return this.yperfilmodulos;
    }
    
    public void setYperfilmodulos(Set yperfilmodulos) {
        this.yperfilmodulos = yperfilmodulos;
    }
}


//arquivo xml da classe
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated Aug 2, 2011 3:38:17 PM by Hibernate Tools 3.2.1.GA -->
<hibernate-mapping>
    <class name="classesbd.Yperfil" table="yperfil" catalog="ibgdb">
        <id name="id" type="java.lang.Long">
            <column name="id" />
            <generator class="identity" />
        </id>
        <property name="perfil" type="string">
            <column name="perfil" length="50" not-null="true" />
        </property>
        <property name="observacao" type="string">
            <column name="observacao" length="50" />
        </property>
        <set name="yusuarioses" inverse="true">
            <key>
                <column name="idperfil" />
            </key>
            <one-to-many class="classesbd.Yusuarios" />
        </set>
        <set name="yperfilmodulos" inverse="true">
            <key>
                <column name="idperfil" />
            </key>
            <one-to-many class="classesbd.Yperfilmodulo" />
        </set>
    </class>
</hibernate-mapping>



//aqui o metodo onde estou tentando fazer o update, seguindo os exemplos que encontrei.
public void alterarPerfil(){
      if(!perfilDesc.getText().isEmpty()){            
            String p = perfilDesc.getText();            
            
            //aqui começa o problema, minha instancia de Query não me traz os metodos setParameter() e executeUpdate(), e não estou entendendo o pq, sendo que usam isso no exemplo. 
           Query query = (Query)new RetornaSessaoHibernate().hibernateSession().createQuery("update Yperfil set setPerfil = :newPerfil, "
                                                                                            + " setObservacao = :newObservacao"
                                                                                            + " where setId = :codigo");
            
            // --> minha instancia query nao traz esses metodos, setParameter e executeUpdate, coloquei aqui apenas para exibicao e vcs verem se realmente é assim que se faz
            query.setParameter("newPerfil", perfilDesc.getText()); 
            query.setParameter("newObservacao", perfilObs.getText());
            query.setParameter("codigo", perfilCod.getText());
            query.executeUpdate();
       }
}

Não estou conseguindo fazer um update usando hibernate. Como fazer isso ?

obrigado

3 Respostas

rodrigocolasso

Bom dia Fernando, tudo bem cara ?

Vamos por partes…

Primeiro eu vi que você usou annotation, beleza é isso mesmo. Porém você também utilizou XML ( :cry: xml hell), como já esta com annotation não é preciso do xml. Só lembra de colocar no hibernate.cfg.xml o mapeamento da classe que contem o annotation, dai fechou essa parte.

Segundo para fazer o update com o hibernate é bem simples, primeiro você faz uma busca do dado que você quer alterar, coloca em um objeto, faz as alterações necessárias e no final você faz o comando session.update(objeto).

Tipo assim:

// Exemplo de hibernateUtil com annotation 

import org.hibernate.SessionFactory;
import org.hibernate.cfg.AnnotationConfiguration;

public class HibernateUtil {
	private static final SessionFactory sessionFactory;
	
	static {
		try {
			sessionFactory = new AnnotationConfiguration().configure().buildSessionFactory();
		} 
		catch (Throwable ex) {
			System.err.println("Erro: " + ex);
			throw new ExceptionInInitializerError(ex);
	    }
	}
	
	public static SessionFactory getSessionFactory() {
		return sessionFactory;
	}
}

// Classe que faz o que você quer

    Session session = HibernateUtil.getSessionFactory().getCurrentSession();
    
    Objeto obj = new Objeto();

    obj = objDAO.getObj(id); // Aqui eu coloqueri um dao, mais o teu update também pode (deveria) estar dentro desse dao

    obj.setCampo1("Nova alteração");
    obj.setCampo2("Outra alteração");
   
   session.beginTransaction();
   session.update(obj);
   session.getTransaction().commit();
fernandopaiva

Opa Rodrigo, comigo td blzera e tu ??? Como anda a pegada aeee ??? kkk !
Entaum, eu havia tentando assim antes.

//aqui como estava tentando fazer.
Session sessao = new RetornaSessaoHibernate().hibernateSession();
Yperfil perfil = new Yperfil();
perfil.setId(Long.parseLong(perfilCod.getText()));
perfil.getId();
perfil.setPerfil(perfilDesc.getText());
perfil.setObservacao(perfilObs.getText());              
sessao.beginTransaction();
sessao.update(perfil);
sessao.getTransaction().commit();



// aqui o erro de retorno.
Exception occurred during event dispatching:
org.hibernate.NonUniqueObjectException: a different object with the same identifier value was already associated with the session: [classesbd.Yperfil#2]
	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.DefaultUpdateEventListener.performSaveOrUpdate(DefaultUpdateEventListener.java:33)
	at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:70)
	at org.hibernate.impl.SessionImpl.fireUpdate(SessionImpl.java:564)
	at org.hibernate.impl.SessionImpl.update(SessionImpl.java:552)
	at org.hibernate.impl.SessionImpl.update(SessionImpl.java:544)
	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.update(Unknown Source)
	at controlpanelforms.AlteraPerfilForm.alterarPerfil(AlteraPerfilForm.java:98)
	at controlpanelforms.AlteraPerfilForm.btnAlterarActionPerformed(AlteraPerfilForm.java:335)
	at controlpanelforms.AlteraPerfilForm.access$600(AlteraPerfilForm.java:34)
	at controlpanelforms.AlteraPerfilForm$7.actionPerformed(AlteraPerfilForm.java:277)
	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.UsuariosPerfilForm.btnAlterarActionPerformed(UsuariosPerfilForm.java:331)
	at controlpanelforms.UsuariosPerfilForm.access$000(UsuariosPerfilForm.java:33)
	at controlpanelforms.UsuariosPerfilForm$2.actionPerformed(UsuariosPerfilForm.java:161)
	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.jMenuItem1ActionPerformed(PrincipalForm.java:146)
	at controlpanelforms.PrincipalForm.access$000(PrincipalForm.java:32)
	at controlpanelforms.PrincipalForm$1.actionPerformed(PrincipalForm.java:110)
	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.AbstractButton.doClick(AbstractButton.java:357)
	at javax.swing.plaf.basic.BasicMenuItemUI.doClick(BasicMenuItemUI.java:809)
	at javax.swing.plaf.basic.BasicMenuItemUI$Handler.mouseReleased(BasicMenuItemUI.java:850)
	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$3.run(PrincipalForm.java:169)
	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)

Sobre o Annotation, quem gera tudo pra mim é o NetBeans e ainda eu uso Engenharia Reversa pq ja tenho todas as tabelas criadas no BD e são mais de 1200. Então quando eu vou fazer alguma coisa no BD, tipo criar outra tabela ou mais fiels em uma, sempre refaço minhas classes pra naum dar problemas.

Obrigado.

fernandopaiva

Opaaaa…Consegui resolver, usei o merge e funcionou, fiz assim.

Session sessao = new RetornaSessaoHibernate().hibernateSession();
Yperfil perfil = new Yperfil();
perfil.setId(Long.parseLong(perfilCod.getText()));
perfil.setPerfil(perfilDesc.getText());
perfil.setObservacao(perfilObs.getText());               
sessao.beginTransaction();
sessao.merge(perfil);
sessao.getTransaction().commit();

Fez o update certinho, vou dar mais uma estudada nesse merge.

obrigado.

Criado 3 de agosto de 2011
Ultima resposta 3 de ago. de 2011
Respostas 3
Participantes 2