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

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top