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

Kan ikke hente id'et for den sidst indsatte række i Hibernate ved hjælp af Oracle

Undtagelsen 'id'er for denne klasse skal tildeles manuelt før du kalder save()' betyder, at du bruger identifikationsgenereringsstrategien for 'Tildelt'.

tildelt lader applikationen tildele en identifikator til objektet, før save() kaldes. Dette er standardstrategien, hvis der ikke er angivet noget element.

Hvis du ikke definerer nogen strategi, går dvaletilstand som standard til 'tildelt'. "tildelt"-strategi indebærer, at dvale forventer, at applikationen leverer sine egne id'er.

Hvis du vil bruge en sekvens-id-generator i Oracle, kan du gøre det med følgende konfiguration -

Hvis du bruger xml -

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

Hvis du bruger anmærkninger -

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

Og din kode skulle se sådan ud -

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)' udføres, foretager hibernate følgende sql-kald til Oracle, henter id'et og sætter det i Country-objekt.

select Country_Id_Seq.nextVal from dual;

Problem med trigger

Da du bruger en trigger til at øge id'et, når en række indsættes, vil dette forårsage et problem med dvalesekvens. Hibernate bruger sekvensen til at generere et id, og databasen bruger triggeren til at øge id'et. Dette resulterer i, at id'et øges to gange.

Du har tre muligheder for at løse dette.

  1. Slet udløseren, fordi det ikke er nødvendigt.

  2. Hvis du stadig har brug for triggeren, fordi tabellen kunne opdateres uden for applikationen, kan du opdatere triggeren, således at id'et kun genereres, hvis id'et ikke er angivet i insert statementHIbernate-problemet med Oracle Trigger til generering af id fra en sekvens

  3. Opret en brugerdefineret id-generator, der bruger triggeren til at indstille id'et i dataene, før det gemmes i db. Tjek følgende link - https://forum.hibernate.org/viewtopic.php?t=973262



  1. Ingen Entity Framework-udbyder fundet for 'MySql.Data.MySqlClient' ADO.NET-udbyder

  2. Oracle til PostgreSQL:Grunde til at migrere

  3. Beregning af beholdningsgennemsnitlige omkostninger i SQL

  4. Forespørgsel tilskud til en tabel i postgres