Hibernate - Alterar

18 respostas
montovani

Ola pessoal boa tarde!

Pessoal estou precisando fazer uma alteração no banco, so que a tabela que estou tentando alterar os dados tem um chave primaria fraca, e preciso passar mas alguns argumentos para se indentificar um tupla(linha). Bem como posso fazer para execultar uma alteração deste tipo com hibernate, no caso pessei em execultar o sql porem tem dois fatores, primeiro que ai eu não aproveitaria o que o hibernate me oferece de mais bacana(o fato de nao ta precisando cria-las) e segundo que também não consegui mesmoooo :oops: .

Alguma ideia? Desde ja agradeço.

18 Respostas

pedruhenrik

montovani

pesquise por HQL, é uma maneira de se fazer SQL com hibernate.

http://docs.jboss.org/hibernate/core/3.3/reference/en/html/queryhql.html

att,

montovani

Cara deu uma olha e fiz, mas so que ta gerando um erro dizendo que a tabela nao esta mapeado, mas esta, tanto que eu incluo nele pelo hibernate. Tem que ser feito algo a mais? O erro e o codigo que fiz segue abaixo.

Codigo:

public void alterar(AcentoFutebol acento){
        
        Query query = session.createQuery("update valoringresso set parcelado= :parcelado, valoringresso= :valoringresso where idjogo= :idjogo and idlugar= :idlugar");
        query.setInteger("idlugar", acento.getIdlugar());
        query.setInteger("idjogo", acento.getIdjogo());
        query.setInteger("valoringresso", acento.getValoringresso());
        query.setString("parcelado", acento.getParcelado());
        int result = query.executeUpdate();
    }

Erro:

Exception occurred during event dispatching:
org.hibernate.hql.ast.QuerySyntaxException: valoringresso is not mapped [update valoringresso set parcelado= '01', valoringresso= 40 where idjogo= 23 and idlugar= 1]
        at org.hibernate.hql.ast.util.SessionFactoryHelper.requireClassPersister(SessionFactoryHelper.java:158)
        at org.hibernate.hql.ast.tree.FromElementFactory.addFromElement(FromElementFactory.java:87)
        at org.hibernate.hql.ast.tree.FromClause.addFromElement(FromClause.java:70)
        at org.hibernate.hql.ast.HqlSqlWalker.createFromElement(HqlSqlWalker.java:255)
        at org.hibernate.hql.antlr.HqlSqlBaseWalker.fromElement(HqlSqlBaseWalker.java:3056)
        at org.hibernate.hql.antlr.HqlSqlBaseWalker.fromElementList(HqlSqlBaseWalker.java:2945)
        at org.hibernate.hql.antlr.HqlSqlBaseWalker.fromClause(HqlSqlBaseWalker.java:688)
        at org.hibernate.hql.antlr.HqlSqlBaseWalker.updateStatement(HqlSqlBaseWalker.java:345)
        at org.hibernate.hql.antlr.HqlSqlBaseWalker.statement(HqlSqlBaseWalker.java:237)
        at org.hibernate.hql.ast.QueryTranslatorImpl.analyze(QueryTranslatorImpl.java:228)
        at org.hibernate.hql.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:160)
        at org.hibernate.hql.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:111)
        at org.hibernate.engine.query.HQLQueryPlan.<init>(HQLQueryPlan.java:77)
        at org.hibernate.engine.query.HQLQueryPlan.<init>(HQLQueryPlan.java:56)
        at org.hibernate.engine.query.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:72)
        at org.hibernate.impl.AbstractSessionImpl.getHQLQueryPlan(AbstractSessionImpl.java:133)
        at org.hibernate.impl.AbstractSessionImpl.createQuery(AbstractSessionImpl.java:112)
        at org.hibernate.impl.SessionImpl.createQuery(SessionImpl.java:1623)
        at conexao.AcentosDAO.alterar(AcentosDAO.java:78)
        at gerenteingresso.AcentosFutebol.processaDados(AcentosFutebol.java:1160)
        at gerenteingresso.AcentosFutebol.jbProcessaActionPerformed(AcentosFutebol.java:1113)
        at gerenteingresso.AcentosFutebol.access$1800(AcentosFutebol.java:35)
        at gerenteingresso.AcentosFutebol$19.actionPerformed(AcentosFutebol.java:698)
        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:6267)
        at javax.swing.JComponent.processMouseEvent(JComponent.java:3267)
        at java.awt.Component.processEvent(Component.java:6032)
        at java.awt.Container.processEvent(Container.java:2041)
        at java.awt.Component.dispatchEventImpl(Component.java:4630)
        at java.awt.Container.dispatchEventImpl(Container.java:2099)
        at java.awt.Component.dispatchEvent(Component.java:4460)
        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:4460)
        at java.awt.EventQueue.dispatchEvent(EventQueue.java:599)
        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:1563)
        at java.awt.Component.setVisible(Component.java:1515)
        at java.awt.Window.setVisible(Window.java:842)
        at java.awt.Dialog.setVisible(Dialog.java:986)
        at gerenteingresso.AcentosFutebol$20.run(AcentosFutebol.java:1669)
        at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209)
        at java.awt.EventQueue.dispatchEvent(EventQueue.java:597)
        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)
pedruhenrik

qual o nome da sua entidade e nome dos atributos?

acho q o seu sql ta errado.

eu tenho a Entidade Usuario e os atributos login e senha, olha como fica:

String hql = "from Usuario as usuario where login = '" + usuario.getLogin() + "' and senha = '" + usuario.getSenha() + "'";

att,

montovani

valoringresso o nome da entidade
os atributos são:
idjogo
idlugar
parcelado
valoringresso

Só que os que quero alterar e só os dois ultimos atributos.

bem mas este exemplo não seria para inserir. Eita velho to apanhando igual cachorro doido :slight_smile: :cry:

pedruhenrik

o nome da sua entidade esta com V maiusculo ou minusculo?

experimenta assim:

e assim:

nesse meu exemplo eu só fiz um select msm.

KKK normal,logo vc resolve.

att,

montovani

Cara ta tudo minusculo.

Bem os teste que vc sugeriu brother infelismente nao deu.

:lol: rsrsr Cara eu espero porque senão vou ter que abandonar o hibernete e fazer tudo por sql. Affs… quero nem imaginar isto. :cry:

pedruhenrik

estranho.

e assim?

posta a sua entidade Valoringresso.

att,

montovani

Isto cara so que o valor da entidade esta minusculo

Classe que contem os dados de valoringresso

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package dados;

import java.io.Serializable;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;


/**
 *
 * @author Administrador
 */
@Entity
@Table(name="valoringresso")
public class AcentoFutebol implements Serializable {
    @Id
    @Column(name="idjogo")
    private int idjogo;
    @Column(name="idlugar")
    private int idlugar;
    @Column(name="valoringresso")
    private int valoringresso;
    @Column(name="parcelado")
    private String parcelado;

    public int getIdjogo() {
        return idjogo;
    }

    public void setIdjogo(int idjogo) {
        this.idjogo = idjogo;
    }

    /**
     * @return the idlugar
     */
    public int getIdlugar() {
        return idlugar;
    }

    /**
     * @param idlugar the idlugar to set
     */
    public void setIdlugar(int idlugar) {
        this.idlugar = idlugar;
    }

    /**
     * @return the parcelado
     */
    public String getParcelado() {
        return parcelado;
    }

    /**
     * @param parcelado the parcelado to set
     */
    public void setParcelado(String parcelado) {
        this.parcelado = parcelado;
    }

    /**
     * @return the valoringresso
     */
    public int getValoringresso() {
        return valoringresso;
    }

    /**
     * @param valoringresso the valoringresso to set
     */
    public void setValoringresso(int valoringresso) {
        this.valoringresso = valoringresso;
    }

}

Desde ja cara valeu pela força ai. :lol:

pedruhenrik

[chuteModeOn]

[/chuteModeOn]

olha nem testei ainda mas tenta assim, o q acontece rs.

assim q sobrar um tempo livre vou testar para valer.

att,

montovani

pedruhenrik:
[chutometroModeOn]

[/chutometroModeOn]

olha nem testei ainda mas tenta assim, o q acontece rs.

assim q sobrar um tempo livre vou testar para valer.

att,

Cara… vou testar, mas AcentosFutebol e so o nome da classe VO, o nome da tabela no banco(Postgresql) e valoringresso mesmo. Bem vou testar para desencargo, mas se der certo vou achar este troxo estranho viu… rsrsrs.

montovani

Cara fiz o teste aqui e esta acontecendo como uns testes que eu fiz execultando em vez da função session.createQuery() a função session.createSQLQuery(). No caso ele execulta, nao da nenhum erro, porem não alterar nada no banco. Muitooooo estranho velho. O mesmo SQL se execulto no PGAdim fufa que e uma maravilha, mas com o Hibernate, so Jesus. :frowning: :cry:

Alias vc sabe me dizer qual e a diferença entre esta duas funções e porque devo usar uma e nao a outra?

pmlm

Tu estás a fazer update à entidade mesmo. O Hibernate encarrega-se de fazer à tabela. Daí aquele @Table na classe.

montovani

Hum boa cara… não sabia valeu :lol: . Mas vc sabe me responder tambem qual a diferença entra a função createSQLQuery e createQuery e porque devo usar uma e nao a outra. Ta estranho o trem nao gera erro mas nao altera, ja tentei inverter a posição dos parametros para ver se era isto mais nada. :cry:

pedruhenrik

olha acho q o monstrinho abaixo funciona, pelo menos temporariamente:

public void alterar(AcentoFutebol acento) { Transaction tx = this.session.beginTransaction(); String query = "update AcentoFutebol as acento set parcelado= '" + acento.getParcelado() + "',valoringresso= '" + acento.getValoringresso() + "'where idjogo=" + acento.getIdjogo() + "and idlugar= '" + acento.getIdlugar() + "'"; Query q = session.createQuery(query); q.executeUpdate(); tx.commit(); }

att,

pedruhenrik

[url]http://docs.jboss.org/hibernate/core/3.3/reference/en/html/batch.html#batch-direct[/url]

13.4. DML-style operations

As an example, to execute an HQL UPDATE, use the Query.executeUpdate() method. The method is named for those familiar with JDBC's PreparedStatement.executeUpdate():

Session session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();

String hqlUpdate = "update Customer c set c.name = :newName where c.name = :oldName";
// or String hqlUpdate = "update Customer set name = :newName where name = :oldName";
int updatedEntities = s.createQuery( hqlUpdate )
        .setString( "newName", newName )
        .setString( "oldName", oldName )
        .executeUpdate();
tx.commit();
session.close();

acho q o ideal seria assim.

att,

pedruhenrik

com HQL:

public void atualiza(AcentoFutebol acento) {
	Transaction tx = session.beginTransaction();

	String hqlUpdate = "update AcentoFutebol acento set acento.parcelado= :parcelado,acento.valoringresso= :valoringresso where acento.idjogo= :idjogo and acento.idlugar= :idlugar";

        session.createQuery(hqlUpdate)
	.setString("parcelado", acento.getParcelado())
	.setInteger("valoringresso", acento.)
	.setInteger("idjogo", acento.)
	.setInteger("idlugar", acento.).executeUpdate();
	tx.commit();
	session.close();
}

att,

pedruhenrik

http://www.guj.com.br/java/120197-consulta-hibernate
http://www.guj.com.br/java/84558-de-sql-para-hqllinguagem-sql-do-hibernate—resolvido

createQuery é usado para criar HQL
createSQLQuery é usado para criar uma query SQL Nativa (eu acho).

att,

montovani

Cara fechou deu certo. Observei que sem o comit ele não ia, quando você postou esta alterantiva com o comit, pensei será que e por isto que ele execulta mas nao ta alterando. Era e faz sentido ne… mas não tinha colocado pq pensei que este metodo createQuery ja fazia isto tudo por traz dos panos, mas beleza. O codigo ficou assim então:

public  void alterar(AcentoFutebol  acento) {
         Transaction tx = this.session.beginTransaction();
         String query = "update AcentoFutebol set parcelado= :parcelado, valoringresso= :valoringresso "
                 + "where idjogo= :idjogo and idlugar= :idlugar";
         Query q = session.createQuery(query)
                 .setParameter("idlugar", acento.getIdlugar())
                 .setParameter("idjogo", acento.getIdjogo())
                 .setParameter("parcelado", acento.getParcelado())
                 .setParameter("valoringresso", acento.getValoringresso());
         q.executeUpdate();
         tx.commit();
     }

Valeu brother, brigadão pela sua atenção ai. Abraços inte.

Criado 20 de junho de 2011
Ultima resposta 21 de jun. de 2011
Respostas 18
Participantes 3