JPA 2.0 Eclipselink Verifique se há exclusivo
-
27-09-2019 - |
Pergunta
Eu tenho uma coluna como exclusiva = true .. na aula de exame ... Eu descobri que porque as transações são cometidas automaticamente, para forçar o compromisso que eu uso em.commit ()
No entanto, eu gostaria de saber como verificar se é único. Running uma consulta não é uma solução porque pode ser um inserto depois de verificar por causa da concurência ....
Qual é a melhor maneira de verificar a unidade?
List<Exam_Normal> exam_normals = exam.getExam_Normal();
exam.setExam_Normal(null);
try {
em.persist(exam);
em.flush();
Long i = 0L;
if (exam_normals != null) {
for (Exam_Normal e_n : exam_normals) {
i++;
e_n.setItem(i);
e_n.setId(exam);
em.persist(e_n);
}
}
} catch (Exception e) {
System.out.print("sfalma--");
}
}
d
Solução
Infelizmente, com o JPA, não há como evitar uma reversão de transações sobre uma violação de restrição exclusiva, pois a especificação requer essa exceção para marcar a transação para reversão. Além disso, como a linha pode não existir quando você emite a chamada 'Lock' usando o JPA 2.0 APIs A chamada 'Lock' não garantirá que apenas o encadeamento de travamento possa inserir o objeto. Um 'bloqueio' impediria a atualização da entidade, mas não a inserção.
Você precisaria executar o 'persistir' como você tem em seu código, mas mantê -lo o mais próximo possível do início da transação ou que a operação ocorra em sua própria transação.
Se o 'persistir' deve fazer parte de uma transação maior e a falha em persistir não impede que essa parte do seu aplicativo seja bem -sucedida, você deve armazenar as instâncias da entidade dessa transação e você poderá 'mesclar' em qualquer coisa subsequente Transação assim que seu aplicativo se recuperar da reversão.
Outras dicas
No entanto, gostaria de saber como verificar se é único. Executar uma consulta não é uma solução, porque pode ser uma inserção depois de verificar por causa da simultaneidade ....
O JPA 2.0 permite bloqueio pessimista e adiciona três modos de bloqueio para isso. Isso pode ser uma opção para o seu caso de uso.
Algumas referências:
Presumo que a coluna não seja uma chave primária (@Id
) nesse caso, seu aplicativo precisa garantir a singularidade. A garantia de singularidade do campo provavelmente terá que vir de outros lugares. Que tipo de valor é o campo? Aqui estão algumas idéias
Se for um contador, você provavelmente pode usar @Singleton
Bean Stateful (Javaee 6. Veja isto.
Se você está usando o EE5, então um feijão apátrido com um @Entity
Isso mapeia para uma chave gerada automaticamente.