sql >> Databasteknik >  >> RDS >> Oracle

Det går inte att hämta ID:t för den senast infogade raden i Hibernate med Oracle

Undantaget 'id för denna klass måste tilldelas manuellt innan du anropar save()' betyder att du använder identifierargenereringsstrategin för 'Assigned'.

tilldelad låter applikationen tilldela en identifierare till objektet innan save() anropas. Detta är standardstrategin om inget element anges.

Om du inte definierar någon strategi, viloläge som standard till "tilldelad". "tilldelad" strategi innebär att hibernate förväntar sig att applikationen tillhandahåller sina egna ID.

Om du vill använda en sekvens-id-generator i Oracle kan du göra det med följande konfiguration -

Om du använder xml -

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

Om du använder anteckningar -

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

Och din kod bör se ut så -

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()); 

När 'session.save(c)' körs gör hibernate följande sql-anrop till Oracle, hämtar ID:t och sätter det i Country-objektet.

select Country_Id_Seq.nextVal from dual;

Problem med utlösaren

Eftersom du använder en utlösare för att öka id:t när en rad infogas, kommer detta att orsaka problem med vilolägessekvensen. Hibernate använder sekvensen för att generera ett id och databasen använder triggern för att öka id:t. Detta resulterar i att id:t ökas två gånger.

Du har tre alternativ för att lösa detta.

  1. Ta bort utlösaren eftersom det inte är nödvändigt.

  2. Om du fortfarande behöver triggern eftersom tabellen kan uppdateras utanför programmet kan du uppdatera triggern så att ID:t genereras endast om ID:t inte är inställt i insert statementHIbernate-problemet med Oracle Trigger för att generera ID från en sekvens

  3. Skapa en anpassad id-generator som använder triggern för att ställa in id:t i data innan det sparas i db. Kolla in följande länk - https://forum.hibernate.org/viewtopic.php?t=973262



  1. Hur man tar bort ledande blanksteg i MySQL

  2. oracle - konvertera många datumformat till ett enda formaterat datum

  3. Ta bort utfyllnad när du skickar frågeresultat i ett e-postmeddelande från SQL Server (T-SQL)

  4. Trigger med dynamiskt fältnamn