2016-04-08 90 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,正如我在我的帖子中所說的那樣。 –