Pessoal,
estou quebrando a cabeça aqui e tenho certeza de que existe uma forma mais clara de fazer isso mas não estou conseguindo entender…
Tenho uma tabela bem simples:
Cidade {
@Id
private String codigo;
private String descricao;
Só que nesse caso, meu código é fornecido por mim, automaticamente através de um max(codigo) from cidade.
O problema, como podem já perceber, é que :
. Quando eu entro em minha tela, o registro aparece para o cliente, por exemplo - Código Cidade: 100
. Quando o cliente vai tentar gravar esse registro na tabela, pode ocorrer a concorrência de outro usuário já ter gravado essa cidade com o código 100
No caso dessa concorrência, eu tenho a seguinte estrutura de persistência:
EntityManager em = null;
try {
em = MeuJPA.getEntityManager();
em.getTransaction().begin();
em.flush();
em.persist(meuObjeto);
} catch (Exception ex) {
//Realiza uma exceção
} finally {
em.getTransaction().commit();
em.close();
}
O problema é que a exception não ocorre na minha estrutura, dentro do TRY, mas sim quando eu estou executando a linha
Aí ele irá lançar:
Internal Exception: com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Duplicate entry '100' for key 'PRIMARY'
Se eu transferir essa linha para dentro do meu try, posso ter problemas da minha transação não ocorrer quando houver ocorrido uma exception, correto?
O que eu faço nesse caso? Abro um novo try…catch dentro do finally?
Ou existe alguma estrutura que eu possa fazer o tratamento desse gerenciamento do atributo código de acordo com a minha regra de max(codigo)+1?