Hibernate + oracle + sequences

Ae pessoal

Tenho duas aplicações aqui acessando um mesmo banco em oracle, uma delas acessa via jdbc e outra via hibernate. Porém, reparei que os registros inseridos pelo jdbc possuiam id menor que os do hibernate, algo em torno de id 50 para jdbc e 5000 para hibernate. Fui olhar a sequence e o jdbc esta usando certinho, então é o hibernate que não esta pegando o valor da sequence, percebi que ele esta acrescentando o id de 50 em 50 e pelo que olhei a configuração dos meus entitys, está certo, inclusive mostrando o sql gerado no console do jboss aparece o select nextval que ele faz na sequencia… fiz um teste em outra aplicação que acessa postgree para e que o entity está configurado da mesma forma e ai o hiberante fez certo (pega o valor da sequence).

alguem sabe se existe algum detalhe a mais para configurar essas sequencias para o oracle?! ou de onde o hibernate esta tirando esses valores ja que aparentemente não é de sequencia nenhuma?!

valeu!

Cola pra gente dar uma olhda no seu arquivo .hbm.xml :joia:

Ae, valeu pela resposta…
para mapeamento eu uso annotations, deixei apenas o código da chave para não ficar muito grande, segue:

@Table(name = "AUDITORIA")
@Entity
@BatchSize(size = 0)
@SequenceGenerator(name = "SEQMOB_AUDITORIA", sequenceName = "SEQMOB_AUDITORIA")
public class AuditBean implements Serializable {

	private static final long serialVersionUID = 1L;

	private Long id;

	@Id
	@Column(name = "CD_AUDITORIA")
	@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "SEQMOB_AUDITORIA")
	public Long getId() {
		return id;
	}

	public void setId(Long id) {
		this.id = id;
	}

}

o hibernate.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">

<hibernate-configuration>
        <session-factory>
                <property name="dialect">org.hibernate.dialect.Oracle9Dialect</property>
                <property name="show_sql">true</property>
                <property name="use_outer_join">false</property>
                <property name="connection.username">BLABLA</property>
                <property name="connection.password">*****</property>
                <property name="connection.driver_class">oracle.jdbc.driver.OracleDriver</property>
                <property name="connection.url">jdbc:oracle:thin:@ip:porta:TESTE</property>
                <property name="hibernate.hbm2ddl.auto">UPDATE</property>

                <mapping class="com.nexxera.vfn.bean.AuditBean"/>
        </session-factory>
</hibernate-configuration>

Aparentemente esta identico a outra aplicação que eu mexia que usava postgree, onde o treco funcionava.

valeu!

@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = “SEQMOB_AUDITORIA”)

tente mudar pra
@GeneratedValue(strategy = GenerationType.IDENTITY, generator = “SEQMOB_AUDITORIA”)

Não deu, ele gerou um SQLException pq gerou valor null para a chave:

Caused by: java.sql.SQLException: ORA-01400: não é possível inserir NULL em ("VFNLUIZ"."AUDITORIA"."CD_AUDITORIA")

O engraçado é que com SEQUENCE, ele gera esse SQL:

Hibernate: select SEQMOB_AUDITORIA.nextval from dual
Hibernate: insert into AUDITORIA (CD_USUARIO, DT_DATAHORA, DS_EVENTO, DS_ACAO, CD_AUDITORIA) values (?, ?, ?, ?, ?)

ou seja, faz o select na sequence, atualiza ela, mas não usa o valor, terminei ontem o dia com ele gerando chave ali pelos 5000+ e agora ele tah inserindo com 29000+…

8O

Achei… ow falta de ler a documentação ehhehe o problema ocorria porque eu usava sequence da base sem setar o allocationSize do @SequenceGenerator, que por padrão é 50

Com base em:
http://www.hibernate.org/hib_docs/annotations/reference/en/html/entity.html

coloquei allocationSize e “funco” certinho… agora só vou ter que acertar essas sequences na base hehehe

valeu ai pela ajuda.[/b]

[quote=“luBS”]Achei… ow falta de ler a documentação ehhehe o problema ocorria porque eu usava sequence da base sem setar o allocationSize do @SequenceGenerator, que por padrão é 50

Com base em:
http://www.hibernate.org/hib_docs/annotations/reference/en/html/entity.html

coloquei allocationSize e “funco” certinho… agora só vou ter que acertar essas sequences na base hehehe

valeu ai pela ajuda.[/b][/quote]

Olá, teria como vc postar o resultado final do seu código ??

Valew.

As anotações ficaram assim:

@Table(name = "AUDITORIA")
@Entity
@SequenceGenerator(name = "SEQMOB_AUDITORIA", sequenceName = "SEQMOB_AUDITORIA", allocationSize = 1)
public class Audit {
	private Long id;
....
....
...
	@Id
	@Column(name = "CD_AUDITORIA")
	@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "SEQMOB_AUDITORIA")
	public Long getId() {
		return id;
	}
}