2016-04-08 5 views
0

Ich habe diese @NamedNativeQuery@NamedNativeQuery Beschränkungsverletzung - Transaktion

@NamedNativeQuery(name = "Certificacion.updateCertificacionAclaraciones", query = "UPDATE CERTIFICACION " 
       + "SET PENDIENTE_GENERACION = :pendienteGeneracion, ID_ACLARACIONES_TEMP_ESCRITO = :idAclaracion " 
       + "WHERE ID IN (:paso)") 

Und ich habe diese EJB Struktur einer Transaktion zu erhalten

@TransactionManagement(TransactionManagementType.CONTAINER) 
@Stateless 
public class PRequerimientoCCServiceBean implements 
     IPRequerimientoCCServiceBeanLocal { 
    @Override 
    @TransactionAttribute(TransactionAttributeType.REQUIRED) 
     public void guardarRequerimiento(Usuario usuario, 
       ConjuntoCertificaciones conjunto, String aclaracionGeneral, 
       Map<Long, String> mapAclaracionColegio) throws RollbackException { 
      try { 
       // Realizamos el guardado de las aclaraciones y la generación del 
       // documento 
       AclaracionesTempEscrito currentAclaracion = new AclaracionesTempEscrito(); 
       ... 
       entityManager.persist(currentAclaracion); 
       generarDocumento(currentAclaracion, conjunto, usuario); 
      } catch (Exception e) { 
       ejbContext.setRollbackOnly(); 
       throw new RollbackSajgException(); 

      } 
     } 


    @TransactionAttribute(TransactionAttributeType.MANDATORY) 
     private void generarDocumento(AclaracionesTempEscrito findAclaracion, 
       ConjuntoCertificaciones conjunto, Usuario usuario) 
       throws RollbackException { 
    ... 
    Query actualizaCertificacionesAclaracion = entityManager 
         .createNamedQuery("Certificacion.updateCertificacionAclaraciones"); 
       actualizaCertificacionesAclaracion 
         .setParameter("pendienteGeneracion", true) 
         .setParameter("idAclaracion", findAclaracion.getId()) 
         .setParameter("paso", paso).executeUpdate(); 

     } 
    } 

Es nehme an, dass ich begehen wird ausgeführt, wenn guardarRequerimiento Verfahren endet aber Wenn ich meine nativeQuery mit executeUpdate führe bekomme ich eine Ausnahme von ConstraintViolation

org.hibernate.exception.ConstraintViolationException: konnte nicht Aussage

Ich denke ausführen, dass es da ist, obwohl findAclaracion.getId() in der Transaktion vorhanden ist, wird es nicht in der Datenbank vorhanden ist und die executeUpdate müssen, dass dieses Objekt in der Datenbank vorhanden ist weil es nicht in meinem Persistenzkontext ist, wenn es ausgeführt wird.

Warum bekomme ich dieses Verhalten? Wie kann ich lösen?

Vielen Dank.

Antwort

0

Sie können versuchen, dieses Objekt nach Flush und vor genererDocumento zu aktualisieren (currentAcclaracion, conjunto, usuario); oder Sie es als Abfrage und Schleife tun, dass objektliste Werte zu aktualisieren ..

+0

Wenn ich einen Flush alles außer Ordnung ist, wenn executeUpdate actualizaCertificacionesAclaracion eine Ausnahme aus, weil ich versuche, ein Zurückkehren zu tun, aber es nicht Wirkung haben, es schon ist in der DB. Andererseits, wenn ich keinen Flush mache, bekomme ich ConstraintViolation, wie ich auf meinem Post sage. –