Tratar erro com JPA ao inserir registro com coluna unique=true

Olá Pessoal!
Eu gostaria de tratar o erro ao tentar inserir o registro no banco de dados, e este registro já existe. Estou usando JPA com Hibernate. Este é o codigo que gerar o erro, mas eu queria capturar e tratar o erro exibindo ao usuario uma mensagem mais amigavel.

private EntityManager em = EntityManagerUtil.getEntityManager();; public String gravar() { try { if (em.getTransaction().isActive() == false) { em.getTransaction().begin(); } em.merge(objeto); em.getTransaction().commit(); mensagem = "Objeto incluido com sucesso!"; return SUCCESS; } catch (Exception e) { mensagem = "Erro ao incluir: " + e.getMessage(); return INPUT; }
Da maneira que está me retorna :

Se eu tento pegar a exception mais baixa usando este método:

public static String getMensagemErro(Exception e) { while (e.getCause() != null) { e = (Exception) e.getCause(); } return e.getMessage(); }

retorna:

Qual exceção eu deveria usar para capturar a mensagem do banco de dados corretamente e tratar?
Eu olhei nos tópicos existentes no fórum mas não conseguir me orientar corretamente.
Agradeço a ajuda de todos.

cara,
vc nao ta usando auto incremento ou sequence para seu ID nao?

t+

Estou usando SEQUENCE, mas a coluna que é unica é o nome. Estas são as anotações da minha classe.

@Entity @Table(name="CATEGORIA") public class Categoria implements Serializable { @Id @Column(name="ID") @SequenceGenerator(name="SEQ_GEN_CATEGORIA", sequenceName="GEN_CATEGORIA", allocationSize=1) @GeneratedValue(generator="SEQ_GEN_CATEGORIA", strategy=GenerationType.SEQUENCE) private Integer id; @Column(name="NOME", length=40, nullable=false, unique=true) private String nome;

é so para esse caso que vc tem que tratar essa exception?
se sim, vc pode dar throws e pegar a exception generica la no seu controler e subir a messagem de erro que vc quer,
se não, vc vai ter que tratar a excessao de acordo com o getMessage

t+

Sim é para este caso mas eu já capturo a exceção, e o e.getMessage() me retorna isso:

ou se eu pegar a exceção mais baixa me retorna isso:

Então eu queria ver capturar uma mensagem de erro que eu consiga tratar. Com estas mensagens não tem como saber se foi problema da da chave unica do nome.
Como poderia fazer isso?

faça algo assim entao

public String gravar() throws Exception {  
	    try {  
	        if (em.getTransaction().isActive() == false) {  
	            em.getTransaction().begin();  
	        }  
	        em.merge(objeto);  
	        em.getTransaction().commit();  
	        mensagem = "Objeto incluido com sucesso!";  
	        return SUCCESS;  
	    } catch (Exception e) {  
	        throw new Exception("Já existe esse nome na base");
	    }
	}

Olá! Isso eu posso fazer agora, mas desta forma não conseguiria tratar outro erro que poderia acontecer. Não existe uma forma de capturar o código de erro do postgres?