sql >> Base de Datos >  >> RDS >> Oracle

No se puede recuperar la identificación de la última fila insertada en Hibernate usando Oracle

La excepción 'los ID de esta clase deben asignarse manualmente antes de llamar a save()' significa que está utilizando la estrategia de generación de identificadores de 'Asignado'.

asignado permite que la aplicación asigne un identificador al objeto antes de llamar a save(). Esta es la estrategia predeterminada si no se especifica ningún elemento.

Si no define ninguna estrategia, hibernate se establece de forma predeterminada en 'asignado'. La estrategia 'asignada' implica que Hibernate espera que la aplicación proporcione sus propios identificadores.

Si desea utilizar un generador de ID de secuencia en Oracle, puede hacerlo con la siguiente configuración:

Si está utilizando xml -

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

Si está utilizando anotaciones -

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

Y su código debería verse así:

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

Cuando se ejecuta 'session.save(c)', hibernate realiza la siguiente llamada sql a Oracle, recupera la identificación y la establece en el objeto País.

select Country_Id_Seq.nextVal from dual;

Problema con el activador

Dado que está utilizando un disparador para incrementar la identificación cuando se inserta una fila, esto causará un problema con la secuencia de hibernación. Hibernate está usando la secuencia para generar una identificación y la base de datos está usando el disparador para incrementar la identificación. Esto da como resultado que la identificación se incremente dos veces.

Tienes tres opciones para resolver esto.

  1. Elimine el disparador porque no es necesario.

  2. Si aún necesita el disparador porque la tabla podría actualizarse fuera de la aplicación, puede actualizar el disparador de modo que la identificación se genere solo si la identificación no está configurada en la declaración de inserción Problema de Hibernate con Oracle Trigger para generar la identificación de una secuencia

  3. Cree un generador de ID personalizado que use el activador para establecer el ID en los datos antes de guardarlos en la base de datos. Consulte el siguiente enlace:https://forum.hibernate.org/viewtopic.php?t=973262