Hibernate: Generator X BD:Auto-Incremento

10 respostas
F

Galera estou querendo usar o auto incremento do banco.
Deu uma olhada na documentação e cheguei no seguinte mapeamento da id:

<id name="codigo" type="int" unsaved-value="null">
            <column name="cod_est" sql-type="int" not-null="true" />
        </id>

unsaved-value=“null” --> para atribuir null quando o objeto é transiente e gravar no banco.

Tentei colocar a id do VO como Integer e dá esses paus:

Usando o sessio.saveOrUpdate(objeto);
-Ele só executa update.
-Não insere o objeto de forma alguma.
Erro:

HibernateException: net.sf.hibernate.id.IdentifierGenerationException: ids for this class must be manually assigned before calling save()

Usando o sessio.save(objeto);

HibernateException: net.sf.hibernate.id.IdentifierGenerationException: ids for this class must be manually assigned before calling save()

Usando o sessio.update(objeto) ele funciona legal;


Tentei usar a minha id do VO como int, só que quando tento salvar ela não considera o id como null e sim como o valor default do int (0);

Usando o sessio.save(objeto);

HibernateException: net.sf.hibernate.JDBCException: Could not synchronize database state with session: Entrada em lote 0 insert into estado (descricao, sigla, cod_est) values ( foi abortada. Chame getNextException() para ver a causa.

Ele tenta inserir um novo registro passando a id, dai o banco berra, pois além de estar com auto-incremento ele já tem um registro com id = 0.

Usando o sessio.saveOrUpdate(objeto) ao invés de incluir ele detecta um registro com a mesma id e faz update.

Usando o sessio.update(objeto) ele funciona legal;

Obs.: Estou testando a aplicação com Postgresql mas ela rodará também com Oracle.

10 Respostas

ricardolecheta

o id no xml está como auto-incremento ?

F

Não, meu xml está assim:

<hibernate-mapping default-cascade="none" default-access="property" auto-import="true">
    <class name="geral.cadastros.estado.Estado" 
        table="estado" 
        mutable="true" 
        polymorphism="implicit" 
        dynamic-update="false" 
        dynamic-insert="false" 
        batch-size="1" 
        select-before-update="false" 
        optimistic-lock="version">
        
        <id name="codigo" type="integer" unsaved-value="null">
            <column name="cod_est" sql-type="int" not-null="true" />
        </id>
        
        <property name="descricao" not-null="true" unique="false" update="true" insert="true">
            <column name="descricao" sql-type="varchar(20)" not-null="true" /> 
        </property>
        <property name="sigla" not-null="true" unique="false" update="true" insert="true">
            <column name="sigla" sql-type="varchar(2)" not-null="true" /> 
        </property>

    </class>
</hibernate-mapping>

Como seria a sintaxe para colocar como auto incremento?

Jair_Rillo_Junior

dentro da tag id
coloque outra tag

<generator-class="native" />
F

Coloquei a tag e deu o seguinte erro:

2003-04-25 11:51:13,150 DEBUG hibernate.impl.SessionImpl  -> opened session

2003-04-25 11:51:13,150 DEBUG hibernate.transaction.JDBCTransaction  -> begin

2003-04-25 11:51:13,150 DEBUG hibernate.connection.DriverManagerConnectionProvider  -> total checked-out connections: 0

2003-04-25 11:51:13,150 DEBUG hibernate.connection.DriverManagerConnectionProvider  -> using pooled JDBC connection, pool size: 0

2003-04-25 11:51:13,150 DEBUG hibernate.engine.Cascades  -> unsaved-value strategy NULL

2003-04-25 11:51:13,150 DEBUG hibernate.impl.SessionImpl  -> saveOrUpdate() unsaved instance with id: null

2003-04-25 11:51:13,150 DEBUG hibernate.impl.BatcherImpl  -> 1 open PreparedStatements

2003-04-25 11:51:13,150 DEBUG hibernate.impl.SessionFactoryImpl  -> prepared statement get: select nextval (hibernate_sequence)

Hibernate: select nextval (hibernate_sequence)

2003-04-25 11:51:13,150 DEBUG hibernate.ps.PreparedStatementCache  -> preparing statement: select nextval (hibernate_sequence)

2003-04-25 11:51:13,200 DEBUG hibernate.util.JDBCExceptionReporter  -> SQL Exception

 org.postgresql.util.PSQLException: ERROR: relation hibernate_sequence does not exist

Tenho que cria algum coisa a mais?

ricardolecheta

crie uma sequence chamada hibernate_sequence ,

ou use o SchemaExport do Hibernate e deixe ele criar para vc :wink:

F

Pesquisei sobre isso e vi que essa sequencia tem que ser criada no banco.

Mas tenho duas duvidas.

:arrow: Tenho que criar uma sequencia para cada tabela que quiser usar auto incremento do banco?

:arrow: Como ele trata quando dois registro estão sendo gravados ao mesmo tempo? A chave não será a mesma?

F

Valeu galera já consegui resolver.

Decidi criar uma sequencia para cada tabela.
De qualquer forma se fosse usar o “auto-incremento” do Postgresql ele apenas mascararia a criação da sequencia.

Só ficou uma dúvida. E quando for usar outro banco? Ficarei preso a bancos que possuam esse recurso (criação de sequences)?

ricardolecheta

“fabriciogiordani”:

Só ficou uma dúvida. E quando for usar outro banco? Ficarei preso a bancos que possuam esse recurso (criação de sequences)?

Por isso o colega ManchesteR disse para usar o “native”. Este gerador usa identity, sequence or hilo dependendo de cada banco.

T

Olá,

Você já tentou usar a class-generator: identity? Acredito que ela deixa para o banco a responsabilidade de gerar o valor de auto-incremento ou null caso o campo não seja auto-incremento.

Claudio Torcato.

ricardolecheta

“torcato”:

Você já tentou usar a class-generator: identity?
Claudio Torcato.

Sim, com MySQL e DB2.

Ele faz o auto-incremento sim, mas esta historia de retornar null se não for eu nao sei.

Criado 23 de abril de 2004
Ultima resposta 26 de abr. de 2004
Respostas 10
Participantes 4