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
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.