Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Kann die ID der letzten eingefügten Zeile in Hibernate nicht mit Oracle abrufen

Die Ausnahme „IDs für diese Klasse müssen manuell zugewiesen werden, bevor save() aufgerufen wird“ bedeutet, dass Sie die Bezeichner-Generierungsstrategie „Zugewiesen“ verwenden.

zugewiesen lässt die Anwendung dem Objekt einen Bezeichner zuweisen, bevor save() aufgerufen wird. Dies ist die Standardstrategie, wenn kein Element angegeben ist.

Wenn Sie keine Strategie definieren, ist Hibernate standardmäßig „assigned“. Die 'assigned'-Strategie impliziert, dass Hibernate erwartet, dass die Anwendung ihre eigenen IDs bereitstellt.

Wenn Sie einen Sequenz-ID-Generator in Oracle verwenden möchten, können Sie dies mit der folgenden Konfiguration tun -

Wenn Sie xml verwenden -

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

Wenn Sie Anmerkungen verwenden -

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

Und Ihr Code sollte so aussehen -

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

Wenn „session.save(c)“ ausgeführt wird, führt Hibernate den folgenden SQL-Aufruf an Oracle durch, ruft die ID ab und legt sie im Country-Objekt fest.

select Country_Id_Seq.nextVal from dual;

Problem mit Auslöser

Da Sie einen Trigger verwenden, um die ID zu erhöhen, wenn eine Zeile eingefügt wird, führt dies zu einem Problem mit der Ruhezustandssequenz. Hibernate verwendet die Sequenz, um eine ID zu generieren, und die Datenbank verwendet den Trigger, um die ID zu erhöhen. Dies führt dazu, dass die ID zweimal erhöht wird.

Sie haben drei Möglichkeiten, dies zu beheben.

  1. Löschen Sie den Trigger, da er nicht erforderlich ist.

  2. Wenn Sie den Trigger dennoch benötigen, weil die Tabelle außerhalb der Anwendung aktualisiert werden könnte, können Sie den Trigger so aktualisieren, dass die ID nur generiert wird, wenn die ID nicht in der Insert-Anweisung festgelegt ist. P>

  3. Erstellen Sie einen benutzerdefinierten ID-Generator, der den Trigger verwendet, um die ID in den Daten festzulegen, bevor sie in db gespeichert werden. Sehen Sie sich den folgenden Link an - https://forum.hibernate.org/viewtopic.php?t=973262