Oracle
 sql >> Base de données >  >> RDS >> Oracle

Impossible de récupérer l'identifiant de la dernière ligne insérée dans Hibernate à l'aide d'Oracle

L'exception 'les identifiants de cette classe doivent être attribués manuellement avant d'appeler save()' signifie que vous utilisez la stratégie de génération d'identifiant de 'Assigned'.

attribué permet à l'application d'attribuer un identifiant à l'objet avant que save() ne soit appelée. Il s'agit de la stratégie par défaut si aucun élément n'est spécifié.

Si vous ne définissez aucune stratégie, hibernate par défaut est 'assigné'. La stratégie 'attribuée' implique qu'hibernate s'attend à ce que l'application fournisse ses propres identifiants.

Si vous souhaitez utiliser un générateur d'ID de séquence dans Oracle, vous pouvez le faire avec la configuration suivante -

Si vous utilisez 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 vous utilisez des annotations -

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

Et votre code devrait ressembler à ça -

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

Lorsque 'session.save(c)' s'exécute, hibernate effectue l'appel sql suivant à Oracle, récupère l'identifiant et le définit dans l'objet Country.

select Country_Id_Seq.nextVal from dual;

Problème avec le déclencheur

Puisque vous utilisez un déclencheur pour incrémenter l'id lorsqu'une ligne est insérée, cela causera un problème avec la séquence d'hibernation. Hibernate utilise la séquence pour générer un identifiant et la base de données utilise le déclencheur pour incrémenter l'identifiant. Il en résulte que l'id est incrémenté deux fois.

Vous avez trois options pour résoudre ce problème.

  1. Supprimez le déclencheur car il n'est pas nécessaire.

  2. Si vous avez toujours besoin du déclencheur parce que la table pourrait être mise à jour en dehors de l'application, vous pouvez mettre à jour le déclencheur de sorte que l'identifiant soit généré uniquement si l'identifiant n'est pas défini dans l'instruction d'insertion Problème HIbernate avec Oracle Trigger pour générer l'identifiant à partir d'une séquence

  3. Créez un générateur d'identifiant personnalisé qui utilise le déclencheur pour définir l'identifiant dans les données avant qu'il ne soit enregistré dans la base de données. Consultez le lien suivant - https://forum.hibernate.org/viewtopic.php?t=973262