@NamedNativeQuery约束违规 - 交易

时间:2016-04-08 07:55:27

标签: java hibernate jpa transactions ejb

我有这个@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方法结束时执行提交但是当我使用nativeQuery执行executeUpdate时,我会得到ConstraintViolation

的例外
  

org.hibernate.exception.ConstraintViolationException:不能   执行声明

我认为这是因为虽然事务中存在findAclaracion.getId(),但它在数据库中不存在,executeUpdate需要该对象存在于数据库中,因为执行时不在我的持久化上下文中。

为什么我会出现这种行为?我怎么解决?

谢谢。

1 个答案:

答案 0 :(得分:0)

你可以尝试在flush之后和generarDocumento之前刷新这个对象(currentAclaracion,conjunto,usuario); 要么 您可以将其作为查询并循环该对象列表更新值..