I would figure there would be something in the stack trace to tell you what went wrong, perhaps getLocalizedMessage() or getCause() would help?
Either way, I'm not sure what you are trying to do. System exceptions, to me, are only used when the EJB fails and cannot tell the client why it failed (such as general error message). If the server knows why/how the transaction failed, you should not throw an exception but instead pass a detailed message back to the client about why something failed.
Forgot to say that (as it's described in the previos URL's I�ve sent) when applications are in different containers the root exception is not sent in the stack trace of the TransactionRolledbackException for it's a RMI/IOP (CORBA) limitation.
So we can't trust to find always the cause in the stace trace.
I'm trying to tell you, you shouldn't use exceptions for such detailed messaging (unless you create your own exception class). You should catch the exception on the server level and instead pass a detailed message object back to the client.