2016-04-08 70 views
0

我有这样的@NamedNativeQuery@NamedNativeQuery违反约束 - 交易

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

而且我有这个EJB结构得到

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

     } 
    } 

它以为我会执行提交时guardarRequerimiento方法结束,但交易当我执行我nativeQueryexecuteUpdate我得到一个例外ConstraintViolation

org.hibernate.exception.ConstraintViolationException:无法 执行语句

我认为,这是因为,虽然存在于交易findAclaracion.getId(),它不会在数据库中存在和executeUpdate需要这个对象在数据库中存在因为执行时不在我的持久性上下文中。

为什么我会得到这种行为?我该如何解决?

谢谢。

回答

0

您可以尝试在刷新之后刷新此对象并在generarDocumento(currentAclaracion,conjunto,usuario)之前刷新此对象; 或 你可以做到这一点作为查询和环路链表类更新值..

+0

当我做了刷新,一切都很好,除非executeUpdate的actualizaCertificacionesAclaracion抛出一个异常,因为我尝试做一回退,但它没有效果,它已经在DB中。另一方面,如果我不做冲洗,我得到ConstraintViolation,正如我在我的帖子中所说的那样。 –