我有这个@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
需要该对象存在于数据库中,因为执行时不在我的持久化上下文中。
为什么我会出现这种行为?我怎么解决?
谢谢。
答案 0 :(得分:0)
你可以尝试在flush之后和generarDocumento之前刷新这个对象(currentAclaracion,conjunto,usuario); 要么 您可以将其作为查询并循环该对象列表更新值..