Hibernate -> MySQL to ORACLE

6 respostas
L

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

6 Respostas

L

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.

L

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?

L

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

L

Não está a funcionar…

ClientInfo.hbm.xml (FILHO)

&lt;hibernate-mapping&gt;

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

Pcb.hbm.xml (PAI)

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

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

Este codigo

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

Também ja tentei colocar o generator assim:

&lt;generator class="sequence"&gt;
				&lt;param name="sequence"&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.

L

Tente então o codigo:

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

Não funciona.

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

Estou sem ideias. Tudo funcionava no MySQL.

Criado 16 de janeiro de 2008
Ultima resposta 18 de jan. de 2008
Respostas 6
Participantes 2