2016-04-08 18 views
0

私はこの@NamedNativeQuery@NamedNativeQuery制約違反 - トランザクション

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

を持っていると私はそれは私がguardarRequerimiento方法がなく、終了時にコミット実行されることを想定

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

     } 
    } 

取引を取得するには、このEJB構造を持っていますnativeQueryexecuteUpdateと実行すると例外が発生します。ConstraintViolation

org.hibernate.exception.ConstraintViolationException:ない 文

を実行することができ、私はfindAclaracion.getId()がトランザクションに存在するが、それはデータベースに存在しないとexecuteUpdateは、このオブジェクトがデータベースに存在することを必要とするので、それがあると思います実行時の永続コンテキストにはないためです。

この現象はなぜ発生しますか?どうすれば解決できますか?

ありがとうございます。

答えて

0

flushの後、generarDocumento(currentAclaracion、conjunto、usuario)の前にこのオブジェクトをリフレッシュしようとすることができます。クエリとobjectListが値を更新することをループとしてそれを行うことができます または ...

+0

私はすでに、私はロールバックを行うにしようとするためのexecuteUpdate actualizaCertificacionesAclaracionが例外をスローしかし、それはない効果を持っている場合を除き、フラッシュすべてがうまくありません場合はそれDBにあります。他の手で私がフラッシュをしない場合、私は私の投稿で言うようにConstraintViolationを取得します。 –

関連する問題