Como faço para saber se determinado registro já foi vinculado à outra tabela antes de removê-lo?
A idéia é que, caso um ID_PRODUTO, por exemplo, esteja vinculado à um ITEM_VENDA, eu não consiga remover o produto em questão. Preciso validar isto para retornar uma mensagem amigável para o usuário.
PS: Não consegui tratar a ConstraintViolationException
retornada nesses casos. Se conseguisse, não precisaria desta consulta antes de remover.
Há uma chave estrangeira nas venda ligando ITEM_VENDA com ID_PRODUTO? Esse seria o primeiro passo, acredito.
Você pode tentar também capturar uma exceção de nível mais alto ou diferente (como PersistenceException ou SQLException) e tentar definir qual foi o problema pela mensagem. Veja : https://cursos.alura.com.br/forum/topico-tratamento-de-exce-ccedil-atilde-o-constraintviolationexception-vs-persistenceexception-24414
Outra opção seria realizar uma consulta nas vendas antes da exclusão, para não excluir caso haja uma venda para esse item.
Abraço.
@TerraSkilll boa tarde. Obrigada pela resposta!
Pois então, tentei capturar várias exceções de nível mais alto. PersistenceException
foi uma delas. De qualquer forma, não consegui capturar nenhuma delas.
@Override
@TransactionAttribute(TransactionAttributeType.MANDATORY)
public void remover(Long id) {
try {
T entity = manager.getReference(classe, id);
manager.remove(entity);
} catch (ConstraintViolationException e) {
System.out.println(e.getMessage());
} catch (JDBCException e) {
System.out.println(e.getMessage());
} catch (HibernateException e) {
System.out.println(e.getMessage());
} catch (PersistenceException e) {
System.out.println(e.getMessage());
} catch (RuntimeException e) {
System.out.println(e.getMessage());
} catch (Exception e) {
System.out.println(e.getMessage());
}
}
Estou utilizando MySQL. Tentei usar esta consulta (que encontrei em alguns fóruns) mas nada feito até agora.
SELECT * FROM `vendinha`.KEY_COLUMN_USAGE
WHERE REFERENCED_TABLE_NAME = 'produto' AND
REFERENCED_COLUMN_NAME = 'produto_id';
Obs: As tabelas (e entidades) estão mapeadas corretamente. Até por isso, a exceção é lançada quando tento fazer uma remoção “inválida”.