Oracle
 sql >> Database >  >> RDS >> Oracle

Impossibile recuperare l'ID dell'ultima riga inserita in Hibernate utilizzando Oracle

L'eccezione 'gli ID per questa classe devono essere assegnati manualmente prima di chiamare save()' significa che stai usando la strategia di generazione dell'identificatore di 'Assegnato'.

assegnato consente all'applicazione di assegnare un identificatore all'oggetto prima che save() venga chiamato. Questa è la strategia predefinita se non viene specificato alcun elemento.

Se non si definisce alcuna strategia, l'impostazione predefinita di ibernazione è "assegnata". La strategia "assegnata" implica che l'ibernazione si aspetta che l'applicazione fornisca i propri ID.

Se desideri utilizzare un generatore di ID di sequenza in Oracle, puoi farlo con la seguente configurazione:

Se stai usando xml -

   <id name="countryId" type="java.lang.Integer">  
        <column name="Country_Id" />  
        <generator class="sequence">  
            <param name="sequence">Country_Id_Seq</param>               
        </generator>  
    </id>

Se stai usando le annotazioni -

   @Id
   @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="Country_Id_Seq")
   @SequenceGenerator(name="Country_Id_Seq", sequenceName="Country_Id_Seq"  )
   private Integer sequence;

E il tuo codice dovrebbe apparire così -

Country c=new Country();

c.setCountryName(request.getParameter("txtCountryName"));
c.setCountryCode(request.getParameter("txtCountryCode"));
Zone z=(Zone) session.get(Zone.class, new BigDecimal(request.getParameter("zoneId")));
c.setZone(z);
session.save(c);

session.flush();    
System.out.println(c.getCountryId()); 

Quando 'session.save(c)' viene eseguito, hibernate effettua la seguente chiamata sql a Oracle, recupera l'id e lo imposta nell'oggetto Country.

select Country_Id_Seq.nextVal from dual;

Problema con il trigger

Poiché si utilizza un trigger per incrementare l'id quando viene inserita una riga, ciò causerà un problema con la sequenza di ibernazione. Hibernate sta usando la sequenza per generare un id e il database sta usando il trigger per incrementare l'id. Ciò comporta l'incremento dell'ID due volte.

Hai tre opzioni per risolvere questo problema.

  1. Elimina il trigger perché non è necessario.

  2. Se hai ancora bisogno del trigger perché la tabella potrebbe essere aggiornata all'esterno dell'applicazione, puoi aggiornare il trigger in modo tale che l'id venga generato solo se l'id non è impostato nell'istruzione di inserimento Problema di sospensione con Oracle Trigger per la generazione di ID da una sequenza

  3. Crea un generatore di ID personalizzato che utilizzi il trigger per impostare l'ID nei dati prima che venga salvato in db. Controlla il seguente link:https://forum.hibernate.org/viewtopic.php?t=973262