HIbernate -> ID

Na minha aplicação eu sou responsavel por gerar o ID (pois ele segue uma regra interna da empresa) com isso fiquei na duvida em qual tipo de ID estar utilizando.

OBS: O campo da tabela e INT

Poderia ser um pouco mais claro, que versão do hibernate vc está usando? e como você está fazendo o mapeamento das classes, através de xml ou annotations?

Valeu,
Paulo

bom, se tu segues um regra para gerar id da tua empre, seria melhor especificar o seu campo id como “assigned”, que quer dizer q vc q estabelece o identificador do seu registro.

Eu estava utilizando o assigned porem estou recebendo o erro: SQL insert, update or delete failed (row not found).

Que achei ( segundo http://www.hibernate.org/116.html#A12 ) pudesse ser por estar utilizando o assigned

Coloca no teu hibernate.cfg.xml, na parte q tu defines as configurações de banco “property”: <property name=“show_sql”>true</property>

Isso vai mostrar as instruções sql q o hibernate está fazendo, aí vai ficar mais fácil identificar/contornar o erro.

Deu uma olhada e realmente se eu trocar os valores pela query não rola pois não era pra ele dar update e sim insert

2005-06-09 10:50:27,093 DEBUG [net.sf.hibernate.persister.EntityPersister] Updating entity:
[ClienteCartao#ClienteCartaoPK@bed2ef6]
2005-06-09 10:50:27,093 DEBUG [net.sf.hibernate.impl.BatcherImpl] about to open: 5 open PreparedStatements, 0 open ResultSets
2005-06-09 10:50:27,093 DEBUG [net.sf.hibernate.SQL] update cliente_cartao set nro_cartao=? where cod_cliente=? and cod_tipo=?
2005-06-09 10:50:27,093 INFO  [STDOUT] Hibernate: update cliente_cartao set nro_cartao=? where cod_cliente=? and cod_tipo=?
2005-06-09 10:50:27,109 DEBUG [net.sf.hibernate.impl.BatcherImpl] preparing statement
2005-06-09 10:50:27,109 DEBUG [net.sf.hibernate.persister.EntityPersister] Dehydrating entity:
[ClienteCartao#ClienteCartaoPK@bed2ef6]
2005-06-09 10:50:27,109 DEBUG [net.sf.hibernate.type.StringType] binding '100100100' to parameter: 1
2005-06-09 10:50:27,109 DEBUG [net.sf.hibernate.type.IntegerType] binding '200093428' to parameter: 2
2005-06-09 10:50:27,171 DEBUG [net.sf.hibernate.type.IntegerType] binding '2' to parameter: 3
2005-06-09 10:50:27,171 ERROR [net.sf.hibernate.impl.SessionImpl] Could not synchronize database state with session
net.sf.hibernate.HibernateException: SQL insert, update or delete failed (row not found)

Codigo


Cliente cliente = new Cliente();

Set cartao = new HashSet();

ClienteCartao clienteCartao = new ClienteCartao();
clienteCartao.setNumero("100100100");

ClienteCartaoPK clienteCartaoPK = new ClienteCartaoPK();
clienteCartaoPK.setCodigoCliente(123456);
clienteCartaoPK.setTipo(2);

clienteCartao.setId(clienteCartaoPK);

cartao.add(clienteCartao);

cliente.setCartoes(cartao);

Cliente.xml

  <class
        name="br.com.hermes.popshop.entidades.Cliente"
        table="Cliente"
        dynamic-update="true"
        dynamic-insert="false"
        select-before-update="false"
        optimistic-lock="version"
    >

.
.
.

       <set
            name="cartoes"
            lazy="false"
            inverse="false"
            cascade="all"
            sort="unsorted"
        >

              <key
                  column="cod_cliente"
              >
              </key>

              <one-to-many
                  class="ClienteCartao"
              />
</class>

ClienteCartao.xml

    <class
        name="ClienteCartao"
        table="cliente_cartao"
        dynamic-update="false"
        dynamic-insert="false"
        select-before-update="true"
        optimistic-lock="version"
    >

        <composite-id
            name="id"
            class="ClienteCartaoPK"
        >
                     <key-property
                        name="codigoCliente"
                        type="int"

                        column="cod_cliente"
                />

                     <key-property
                        name="tipo"
                        type="int"
                        column="cod_tipo"
                />

        </composite-id>

        <many-to-one
            name="bandeira"
            class="br.com.hermes.popshop.entidades.TipoCartao"
            cascade="none"
            outer-join="auto"
            update="false"
            insert="false"
            access="property"
            column="cod_tipo"
        />

        <property
            name="numero"
            type="java.lang.String"
            update="true"
            insert="true"
            access="property"
            column="nro_cartao"
            not-null="true"
        />

    </class>

Na hora de fazer o insert, vc chama o save ou saveorUpdate? jah tentou mudar o valor do cascade no seu set?

saveorUpdate ate porque este cliente ja existe no banco de dados. Já fiz alguns testes com cascate mas nada mudou, sempre o mesmo erro. E nada do que diz no faq do hibernate se aplica ao que eu to fazendo.

Se eu não declaro unsave-value ou o declaro com o valor none ele tenta dar update:

2005-06-10 14:19:19,312 INFO [STDOUT] Hibernate: update cliente_cartao set nro_cartao=? where cod_cliente=? and cod_tipo=? 2005-06-10 14:19:19,312 DEBUG [net.sf.hibernate.impl.BatcherImpl] preparing statement 2005-06-10 14:19:19,328 DEBUG [net.sf.hibernate.persister.EntityPersister] Dehydrating entity: ClienteCartao#ClienteCartaoPK@bed2ef6] 2005-06-10 14:19:19,328 DEBUG [net.sf.hibernate.type.StringType] binding '100100100' to parameter: 1 2005-06-10 14:19:19,328 DEBUG [net.sf.hibernate.type.IntegerType] binding '200093428' to parameter: 2 2005-06-10 14:19:19,343 DEBUG [net.sf.hibernate.type.IntegerType] binding '2' to parameter: 3 2005-06-10 14:19:19,343 ERROR [net.sf.hibernate.impl.SessionImpl] Could not synchronize database state with session net.sf.hibernate.HibernateException: SQL insert, update or delete failed (row not found)
Se eu coloco no pk cliente_cartao unsave-value = “any” ele insere o cartão na boa… Fiz uma alteração no numero do cartão e tentei salvar novamente e ao inves dele alterar ele tenta inserir o cartão novamente, violando a chave da minha tabela.