Boa tarde, no método atualizarSalario existe uma interação na lista, e a chamada do método atualizar é realizada para cada objeto da interação, quando retiro o begin e commit, e adiciono a anotação @Transactional o merge não acontece, e nenhum erro é informado.
public class FuncionarioRepository implements Serializable {
private static final long serialVersionUID = 1L;
@Inject
private EntityManager entity;
@Transactional
public void salvar(Funcionario funcionario) {
if (funcionario.getId() == null) {
entity.persist(funcionario);
FacesUtil.addInfoMessage("Cadastrado com sucesso!");
} else {
entity.merge(funcionario);
FacesUtil.addInfoMessage("Alterado com sucesso!");
}
}
@Transactional
public void remover(Funcionario funcionario) {
try {
entity.remove(funcionario);
FacesUtil.addInfoMessage("Removido com sucesso!");
} catch (Exception e) {
e.printStackTrace();
FacesUtil.addErrorMessage("Não foi possível concluir essa operação");
}
}
public void autualizarSalario(List<Funcionario> funcionarios) {
funcionarios.forEach(funcionario -> atualizar(funcionario));
FacesUtil.addInfoMessage("Salários foram atualizados!");
}
// nesse método, se coloco @Transactional, e retiro o begin e o commit, o merge não acontece.
private void atualizar(Funcionario funcionario) {
entity.getTransaction().begin();
entity.merge(funcionario);
entity.getTransaction().commit();
}
public List<Funcionario> listarTodos() {
TypedQuery<Funcionario> query = entity.createQuery("Select f from Funcionario f order by f.nome", Funcionario.class);
return query.getResultList();
}
}
@InterceptorBinding
@Target({ ElementType.TYPE, ElementType.METHOD })
@Retention(RetentionPolicy.RUNTIME)
public @interface Transactional {
}
@Interceptor
@Transactional
public class InterceptorTransactional implements Serializable {
private static final long serialVersionUID = 1L;
@Inject
private EntityManager entity;
@AroundInvoke
public Object contextInterceptor(InvocationContext context) throws Exception {
entity.getTransaction().begin();
Object object = context.proceed();
entity.getTransaction().commit();
return object;
}
}