Well the reason you can't catch ConstraintViolationException is because it's been wrapped by a few others.
At the lowest level you have Hibernate's ConstraintViolationException.
Because of the usage of JPA, that exception is wrapped inside JPA's EntityExistsException
Code:
Caused by: javax.persistence.EntityExistsException: org.hibernate.exception.ConstraintViolationException: could not insert:
Which in turn is wrapped inside an EJB exception by JBOSS
Code:
Caused by: javax.ejb.EJBException: javax.persistence.EntityExistsException: org.hibernate.exception.ConstraintViolationException: could not insert: [address.AddressBookEntity]
So you kinda have to know what layers you have.
You can do
try {
...
} catch (EJBException e) {
Exception cause = e.getCause();
// You can do instanceof to check for types or multiple getcauses
// depending how deep you want to get into the root cause.
}