Problema com o SaveorUpdate do Hibernate

Bom dia!!

Eu tentei usar o comando de saveorUpdate do hibernate…

ele salva… só que quando tento fazer o update ele fala que está com duplicateKey… mas não faz sentido porque é saveorUpdate!!!

alguém sabe porque está acontecendo isso?!!

valeu!!!

Galera taí o erro que está gerando…

Jun 3, 2008 11:44:08 AM org.hibernate.util.JDBCExceptionReporter logExceptions
WARNING: SQL Error: 200, SQLState: I200
Jun 3, 2008 11:44:08 AM org.hibernate.util.JDBCExceptionReporter logExceptions
SEVERE: DUPLICATE KEY
Jun 3, 2008 11:44:08 AM org.hibernate.event.def.AbstractFlushingEventListener performExecutions
SEVERE: Could not synchronize database state with session
org.hibernate.exception.GenericJDBCException: could not insert: [br.com.consist.erp.se.bean.TabelaPrecoBean]
        at org.hibernate.exception.SQLStateConverter.handledNonSpecificException(SQLStateConverter.java:103)
        at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:91)
        at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43)
        at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2267)
        at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2660)
        at org.hibernate.action.EntityInsertAction.execute(EntityInsertAction.java:56)
        at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:250)
        at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:234)
        at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:141)
        at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:298)
        at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:27)
        at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1000)
        at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:338)
        at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:106)
        at br.com.consist.erp.se.dao.TabelaPrecoDAO.save(TabelaPrecoDAO.java:41)
        at br.com.consist.erp.se.service.TabelaPrecoService.save(TabelaPrecoService.java:53)
        at testeunitario.se.UserTabelaPreco.main(UserTabelaPreco.java:90)
Caused by: java.sql.SQLException: DUPLICATE KEY
        at de.sag.jdbc.adabasd.server.AServer.throwSQLException(AServer.java:764)
        at de.sag.jdbc.adabasd.server.AServer.sendExecuteRequest(AServer.java:523)
        at de.sag.jdbc.adabasd.APreparedStatement.sendExecuteRequest(APreparedStatement.java:333)
        at de.sag.jdbc.adabasd.APreparedStatement.executeUpdate(APreparedStatement.java:195)
        at org.hibernate.jdbc.NonBatchingBatcher.addToBatch(NonBatchingBatcher.java:23)
        at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2247)
        ... 13 more
org.hibernate.exception.GenericJDBCException: could not insert: [br.com.consist.erp.se.bean.TabelaPrecoBean]
        at org.hibernate.exception.SQLStateConverter.handledNonSpecificException(SQLStateConverter.java:103)
        at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:91)
        at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43)
        at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2267)
        at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2660)
        at org.hibernate.action.EntityInsertAction.execute(EntityInsertAction.java:56)
        at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:250)
        at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:234)
        at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:141)
        at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:298)
        at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:27)
        at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1000)
        at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:338)
        at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:106)
        at br.com.consist.erp.se.dao.TabelaPrecoDAO.save(TabelaPrecoDAO.java:41)
        at br.com.consist.erp.se.service.TabelaPrecoService.save(TabelaPrecoService.java:53)
        at testeunitario.se.UserTabelaPreco.main(UserTabelaPreco.java:90)
Caused by: java.sql.SQLException: DUPLICATE KEY
        at de.sag.jdbc.adabasd.server.AServer.throwSQLException(AServer.java:764)
        at de.sag.jdbc.adabasd.server.AServer.sendExecuteRequest(AServer.java:523)
        at de.sag.jdbc.adabasd.APreparedStatement.sendExecuteRequest(APreparedStatement.java:333)
        at de.sag.jdbc.adabasd.APreparedStatement.executeUpdate(APreparedStatement.java:195)
        at org.hibernate.jdbc.NonBatchingBatcher.addToBatch(NonBatchingBatcher.java:23)
        at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2247)
        ... 13 more

//olhem também as minhas anotações!
O XStream não influencia em nada!

@Entity
@Table(name = "nomedaTabela")
@IdClass(value=TabelaPrecoBean.class)
@XStreamAlias("tabelaPreco")
public class TabelaPrecoBean implements Serializable {
	
        @Id
        @Column(name="id1")
	@XStreamAlias("tabPrcCodMatGru")
	private Integer codigoMatrizGrupo;
	
        @Id
        @Column(name="id2")
	@XStreamAlias("tabPrcCodEmp")
	private Integer codigoEmpresa;
	
        @Id
        @Column(name="id3")
	@XStreamAlias("tabPrcCodAnoRef")
	private Integer codigoAnoReferencia;
	
        @Id
        @Column(name="id4")
	@XStreamAlias("tabPrcCodMesRef")
	private Integer codigoMesReferencia;
	
        @Id
        @Column(name="id5")
	@XStreamAlias("tabPrcCod")
	private Integer codigoTabelaPreco;
	
        @Id
        @Column(name="id6")
	@XStreamAlias("tabPrcCodProd")
	private String codigoProduto;
	
        @Id
        @Column(name="id7")
	@XStreamAlias("tabPrcCodEmbl")
	private String codigoEmbalagem;

        @Transient
	@XStreamAlias("tabPrcCodDesc")
	private String codigoDescricaoGrupo;

        @Column(name="se19_prven01")
	@XStreamAlias("tabPrcPrcVen1")
	private BigDecimal precoVendaDia01;
	
        @Column(name="se19_prven02")
	@XStreamAlias("tabPrcPrcVen2")
	private BigDecimal precoVendaDia02;
	
        @Column(name="se19_prven03")
	@XStreamAlias("tabPrcPrcVen3")
	private BigDecimal precoVendaDia03;
	
        @Column(name="se19_prven04")
	@XStreamAlias("tabPrcPrcVen4")
	private BigDecimal precoVendaDia04;
	
        @Column(name="se19_prven05")
	@XStreamAlias("tabPrcPrcVen5")
	private BigDecimal precoVendaDia05;
	
        @Column(name="se19_prven06")
	@XStreamAlias("tabPrcPrcVen6")
	private BigDecimal precoVendaDia06;
	
        @Column(name="se19_prven07")
	@XStreamAlias("tabPrcPrcVen7")
	private BigDecimal precoVendaDia07;
	
        @Column(name="se19_prven08")
	@XStreamAlias("tabPrcPrcVen8")
	private BigDecimal precoVendaDia08;
	
        @Column(name="se19_prven09")
	@XStreamAlias("tabPrcPrcVen9")
	private BigDecimal precoVendaDia09;
	
        @Column(name="se19_prven10")
	@XStreamAlias("tabPrcPrcVen10")
	private BigDecimal precoVendaDia10;
	
        @Column(name="se19_prven11")
	@XStreamAlias("tabPrcPrcVen11")
	private BigDecimal precoVendaDia11;
	
        @Column(name="se19_prven12")
	@XStreamAlias("tabPrcPrcVen12")
	private BigDecimal precoVendaDia12;
	
        @Column(name="se19_prven13")
	@XStreamAlias("tabPrcPrcVen13")
	private BigDecimal precoVendaDia13;
	
        @Column(name="se19_prven14")
	@XStreamAlias("tabPrcPrcVen14")
	private BigDecimal precoVendaDia14;
	
        @Column(name="se19_prven15")
	@XStreamAlias("tabPrcPrcVen15")
	private BigDecimal precoVendaDia15;
	
        @Column(name="se19_prven16")
	@XStreamAlias("tabPrcPrcVen16")
	private BigDecimal precoVendaDia16;
	
        @Column(name="se19_prven17")
	@XStreamAlias("tabPrcPrcVen17")
	private BigDecimal precoVendaDia17;
	
        @Column(name="se19_prven18")
	@XStreamAlias("tabPrcPrcVen18")
	private BigDecimal precoVendaDia18;
	
        @Column(name="se19_prven19")
	@XStreamAlias("tabPrcPrcVen19")
	private BigDecimal precoVendaDia19;
	
        @Column(name="se19_prven20")
	@XStreamAlias("tabPrcPrcVen20")
	private BigDecimal precoVendaDia20;
	
        @Column(name="se19_prven21")
	@XStreamAlias("tabPrcPrcVen21")
	private BigDecimal precoVendaDia21;
	
        @Column(name="se19_prven22")
	@XStreamAlias("tabPrcPrcVen22")
	private BigDecimal precoVendaDia22;
	
        @Column(name="se19_prven23")
	@XStreamAlias("tabPrcPrcVen23")
	private BigDecimal precoVendaDia23;
	
        @Column(name="se19_prven24")
	@XStreamAlias("tabPrcPrcVen24")
	private BigDecimal precoVendaDia24;
	
        @Column(name="se19_prven25")
	@XStreamAlias("tabPrcPrcVen25")
	private BigDecimal precoVendaDia25;
	
        @Column(name="se19_prven26")
	@XStreamAlias("tabPrcPrcVen26")
	private BigDecimal precoVendaDia26;
	
        @Column(name="se19_prven27")
	@XStreamAlias("tabPrcPrcVen27")
	private BigDecimal precoVendaDia27;
	
        @Column(name="se19_prven28")
	@XStreamAlias("tabPrcPrcVen28")
	private BigDecimal precoVendaDia28;
	
        @Column(name="se19_prven29")
	@XStreamAlias("tabPrcPrcVen29")
	private BigDecimal precoVendaDia29;
	
        @Column(name="se19_prven30")
	@XStreamAlias("tabPrcPrcVen30")
	private BigDecimal precoVendaDia30;
	
        @Column(name="se19_prven31")
	@XStreamAlias("tabPrcPrcVen31")
	private BigDecimal precoVendaDia31;
	
        @Column(name="se19_dtalter")
	@XStreamOmitField
	private Integer dataAlteracao;
	
        @Column(name="se19_hoalter")
	@XStreamOmitField
	private String horaAlteracao;

//equals hashcode getters and setters..

Thiago tive esse problema a um dias atrás, consegui resolver dessa maneira

public class AdicionaProduto {

     public static void main(String[] args) throws Exception {
        Session session = new HibernateFactory().getSession();
        Produto p = new Produto();
                
        p.setNome("Pneu");
        p.setDescricao("Pirelli");
        p.setPreco(70.0);
        
        Transaction t = session.beginTransaction();
        session.saveOrUpdate(p);
        t.commit();
        System.out.println("Gravado com sucesso");
        System.out.println("ID do produto: " + p.getId());
        session.close();
     }

Assim fuciona para gravar e para alterar vc acrescenta um p.setId(1); que o banco irá verificar que já existe e manda alterar

Espero que tenha te ajudado!!! :slight_smile:

Galera… continuo com o erro…

eu tentei fazer o update ele não aceitou… e também o delete não deu certo.

apareceu essa mensagem quando tentei deletar… não deu erro nenhum, só apareceu isso!

Jun 3, 2008 3:46:39 PM org.hibernate.event.def.DefaultDeleteEventListener deleteTransientEntity
INFO: handling transient entity in delete processing

coloca ai seu codigo para ver onde está o problema :smiley:

tá assim:

public boolean save (TabelaPrecoBean tabelaPreco) throws ConsistException {

Session session = null;
        Transaction tx = null;
        boolean teste = false;
                
        try {
            
            session = HibernateUtil.getSession();
            tx = session.beginTransaction();
            session.saveOrUpdate(tabelaPreco);
            
            tx.commit();
            teste = true;
        } catch (HibernateException e) {

            e.printStackTrace();
            if (tx != null) {
                tx.rollback();
            }

        } finally {

            try {
                if (session != null) {
                    session.close();
                }
            } catch (Exception ex) {
                ex.getCause();
                }
            }

        }
        return teste;
}

Você já entendeu o uso do saveOrUpdate? Ele não decide por você qual operação vai ser realizada na hora de persistir…para que ele atualize você tem que “carregar” o objeto do repositório de persitência de sua aplicação…por que se você fazer um “new” sempre ele vai realizar insert…mas se você primeiro fazer um load no objeto persistido mudar seu estado e depois realizar o comando saveOrUpdate ai sim ele vai realizar o Update…na verdade o que você tá fazendo é criando vários objetos de estados iguais e mandando inserir no banco de dados, ou seja alguma constrait sua tá sendo violada por isso.

Eu tava indo por esse caminho aí mesmo!!! gostei da sua resposta! Eu tentei usar o load… só que eu uso uma composite-Id!!! como eu passo dois ids, nesse caso, pro load?!!

valeu!!

tenta assim

   1. public class AlteraTabela {  
   2.   
   3.      public static void main(String[] args) throws Exception {  
   4.         Session session = new HibernateFactory().getSession();  
   5.         TabelaPrecoBean tabelapreco = new TebelaPrecoBean();  
   6.                   
   7.         tabelapreco.setId(1);  
               tabelapreco.setNome('digite todos os seus sets para testar);

  10.           
  11.         Transaction t = session.beginTransaction();  
  12.         session.saveOrUpdate(tabelapreco);  
  13.         t.commit();  
  14.         System.out.println("Alterado com sucesso");  
  15.         System.out.println("ID da tabela de precos: " + tabelapreco.getId());  
  16.         session.close();  
  17.      }  

Cara da uma tentada desse jeito seguindo essa logica só para testar depois vc implementa no seu codigo

Assim:

[code]@EmbeddedId
private ConceitoDocumentoPK chaveComposta;


public class ConceitoDocumentoPK implements Serializable {

@column
private DocumentoModel documentoModel;

@column
private ConceitoModel conceitoModel;

[/code]