Pegar exceção do TopLink

Boa tarde pessoal,

Tenho uma aplicação utilizando para a camada de persistência EJB 3.0 / JPA com a implementação TopLink da Oracle.

Em um SessionBean estou utilizando o método persist do EM. Quando ocorre alguma violação de integridade, ou alguma primary key duplicada, o TopLink joga no log do AppServer uma SQLException:

[#|2007-01-22T14:13:40.773+0000|SEVERE|sun-appserver-
pe9.0|javax.enterprise.system.container.ejb|_ThreadID=15;_ThreadName
=httpWorkerThread-7022-1;_RequestID=2473c689-475a-4147-9d4c-
fc5b4b9417d4;|EJB5071: Some remote or transactional
roll back exception occurredLocal Exception Stack: 
Exception [TOPLINK-4002] (Oracle TopLink Essentials - 2006.4
(Build 060412)): oracle.toplink.essentials.exceptions.DatabaseException
Internal Exception: java.sql.SQLException:
Duplicate entry 'teste' for key 2Error Code: 1062
Call:INSERT INTO t12_user (T12_ID, T12_LOGIN, T12_NAME, T12_ACTIVE)
 VALUES (?, ?, ?, ?)
	bind => [null, teste, teste, true]

Porém, no código o método persist está em um bloco try/catch e só lança a exceção EJBException:

[#|2007-01-22T14:13:40.804+0000|INFO|sun-appserver-
pe9.0|javax.enterprise.system.container.ejb
|_ThreadID=15;_ThreadName=httpWorkerThread-7022-1;|
javax.ejb.EJBException: Transaction aborted; nested exception is: 
javax.transaction.RollbackException: Transaction marked for rollback.
javax.transaction.RollbackException: Transaction marked for rollback.

Eu gostaria de pegar a SQLException com as informações do porque ocorreu o rollback. Tem como eu pegar isso ou é uma exceção interna que o TopLink lança e só da um “printStackTrace” e só da pra ver no log?

Geralmente, quando o encapsulamento de exceção ocorre você consegue pegar a exceção pai usando:

throwable.getCause();
// message
throwable.getCause().getMessage();

Espero ter ajudado, boa sorte.