Hibernate -> MySQL to ORACLE

Chegou a hora da verdade.

Depois de andar uns meses a desenvolver uma aplicação em 3 camadas (Hibernate, Spring e Struts2) no meu computador pessoal, usando a base de dados MySQL, chegou a hora de testar no servidor oficial.

Este servidor usa como SGBD o ORACLE. O problema é que eu já criei as tabelas no ORACLE e as relações só que o ORACLE não suporta a propriedade AUTO-INCREMENT. Esta propriedade estava mapeado no .hbm.xml e o MySQL aceita isto…

Como faço no ORACLE? Será que as coisas vão funcionar ou posso começar a pensar em deitar todo o trabalho ao lixo e ficar á espera que me despeçam?! :lol:

Preciso de ajuda para ontem.

Obrigado desde já.

No .hbm o id fica assim

<id name=“idMovimentacao” type=“int”>
<column name=“id_movimentacao” />
<generator class=“assigned” />
</id>

E no oracle basta rodar o script - “creat sequence generator”

Com isso vc vai ter uma sequencia vinculada ao seu atributo e tem um auto_increment.

O script “creat sequence generator” que estás a falar pode ser alguma coisa parecida com isto?

CREATE SEQUENCE sequence START WITH 1 INCREMENT BY 1;
CREATE OR REPLACE TRIGGER trigger BEFORE INSERT ON table REFERENCING NEW AS NEW FOR EACH ROW
BEGIN
  SELECT sequence.nextval INTO &#58;NEW.ID FROM dual;
END;

Ao inserir o ORACLE executa isto automaticamente? Eu nao vou ter de alterar o meu HQL pois não, ou seja, nao tenho de ser eu a dizer qual o proximo ID a usar?

É o bastante apenas rodar o:

CREATE SEQUENCE sequence START WITH 1 INCREMENT BY 1;

Se não colocar “START WITH 1 INCREMENT BY 1” ele funciona mas pode colocar um id 15 em outro 40 em outro 10 e assim por diante, não terá uma ordem especifica.

Não está a funcionar…

ClientInfo.hbm.xml (FILHO)

&lt;hibernate-mapping&gt;

    &lt;class name=&quot;com.ht.model.ClientInfo&quot; table=&quot;Thermosoft.ClientInfo&quot; lazy=&quot;false&quot;&gt;
    
      &lt;id name=&quot;id&quot; type=&quot;integer&quot; column=&quot;id&quot;&gt;
			&lt;generator class=&quot;native&quot;&gt;
				&lt;param name=&quot;sequence&quot;&gt;CLIENTINFO_ID&lt;/param&gt; 
			&lt;/generator&gt;
		&lt;/id&gt;
       
       	&lt;!--
        &lt;id name=&quot;id&quot; type=&quot;integer&quot; column=&quot;id&quot; unsaved-value=&quot;0&quot;&gt;
        	&lt;generator class=&quot;identity&quot;/&gt;
		&lt;/id&gt;
      	--&gt;
      	
        &lt;!-- VERSION --&gt;
		&lt;version name=&quot;version&quot; column=&quot;version&quot;/&gt;
        
        &lt;property name=&quot;qm_N&quot;/&gt;
      
        &lt;!-- VALORES POSSIVEIS&#58; ZERO_HOURS, FIELD, SI_PRODUCTION, SI_FIELD --&gt;
        &lt;property name=&quot;origin_Claim&quot; not-null=&quot;true&quot;/&gt;
        
        &lt;property name=&quot;orderN&quot;/&gt;
        
        &lt;property name=&quot;clientServ_N&quot;/&gt;
    &lt;/class&gt;
&lt;/hibernate-mapping&gt;

Pcb.hbm.xml (PAI)

&lt;hibernate-mapping&gt;
	&lt;class name=&quot;com.ht.model.Pcb&quot; table=&quot;Thermosoft.Pcb&quot;&gt;

		&lt;!-- ID --&gt;
		&lt;id name=&quot;id&quot; type=&quot;integer&quot; column=&quot;id&quot;&gt;
			&lt;generator class=&quot;native&quot;&gt;
				&lt;param name=&quot;sequence&quot;&gt;PCB_ID&lt;/param&gt; 
			&lt;/generator&gt;
		&lt;/id&gt;
       
       	&lt;!--
        &lt;id name=&quot;id&quot; type=&quot;integer&quot; column=&quot;id&quot; unsaved-value=&quot;0&quot;&gt;
        	&lt;generator class=&quot;identity&quot;/&gt;
		&lt;/id&gt;
      	--&gt;
		
		&lt;!-- VERSION --&gt;
		&lt;version name=&quot;version&quot; column=&quot;version&quot;/&gt;
		
		&lt;!-- DATE --&gt;
		&lt;!--&lt;property name=&quot;date&quot; type=&quot;java.util.Date&quot;&gt;&lt;/property&gt; --&gt;
		
		&lt;!-- SERIAL NUMBER --&gt;
		&lt;!--&lt;property name=&quot;serialNumber&quot; /&gt;
		
		--&gt;
		&lt;!-- STATE --&gt;
		&lt;property name=&quot;state&quot; type=&quot;com.ht.model.EnumState&quot; not-null=&quot;true&quot;/&gt;
		
		&lt;!-- CLIENTINFO 1&lt;-&gt;1 --&gt;
		&lt;!-- APAGA OS FILHOS --&gt;
		&lt;many-to-one 
			name=&quot;clientInfo&quot; 
			column=&quot;clientInfo_id&quot; 
			unique=&quot;true&quot; 
			not-null=&quot;true&quot; 
			cascade=&quot;all&quot; 
			class=&quot;com.ht.model.ClientInfo&quot; /&gt;
&lt;/class&gt;
&lt;/hibernate-mapping&gt;

Este codigo

&lt;id name=&quot;id&quot; type=&quot;integer&quot; column=&quot;id&quot;&gt;
			&lt;generator class=&quot;native&quot;&gt;
				&lt;param name=&quot;sequence&quot;&gt;PCB_ID&lt;/param&gt; 
			&lt;/generator&gt;
		&lt;/id&gt;

Também ja tentei colocar o generator assim:

&lt;generator class=&quot;sequence&quot;&gt;
				&lt;param name=&quot;sequence&quot;&gt;PCB_ID&lt;/param&gt; 
			&lt;/generator&gt;

é utilizado para indicar a presença de uma SEQUENCE chamada PCB_ID que deve ser usada para atribuir o ID ao registo efectuado.

Isto funciona. O problema é que quando insiro um objecto filho(ClientInfo) o pai não é criado. No pai deveria aparecer a chave estrangeira referente ao seu filho.

O meu mapeamento para uma base de dados MySQL funciona a 100%.

Para inserir estou a usar o método saveOrupdate da classe HibernateTemplate. Neste caso salvo o pai e o filho tb é salvo devido ao mapeamento efectuado.

Alguem me pode ajudar. Estou a ficar sem ideias.

Tente então o codigo:

&lt;id name=&quot;Nome_do_atributo_java&quot; type=&quot;int&quot;&gt;
      &lt;column name=&quot;Nome_da_coluna_no_banco&quot; /&gt;
      &lt;generator class=&quot;sequence&quot; &gt;
             &lt;param name=&quot;sequence&quot;&gt;Nome_do_sequence_no_banco&lt;/param&gt;
      &lt;/generator&gt;
&lt;/id&gt;

Não funciona.

Continua a tentar fazer o insert mas não consegue concluir com sucesso…

Estou sem ideias. Tudo funcionava no MySQL.