Exception ConstraintViolationException só funciona na camada de cima

Olá bom dia, estou com um probleminha aqui que no minimo é curioso, estou usando Hibernate e Spring com banco SqlServer, estou tentando capturar na camada de negocio a exception ConstraintViolationException, esta excessão está acontecendo no meu caso quando eu mando editar um item e coloco o nome de outro item que ja existe no banco, no meu caso o nome do item é uma chave. Então segue os arquivos:

Controlador de Categoria

	public Categoria salvar(Categoria e) throws FiegException {
		try	{
			return categoriaNegocioImp.salvar(e);
		}catch(Exception ex){
			if (ex.getCause() instanceof ConstraintViolationException) {
				throw new FiegException("Ja existe uma categoria com esta descrição");
			} else {
				throw new FiegException(ex);
			}
		}
	}

Negocio de categoria

	@Override
	@Transactional(propagation=Propagation.REQUIRES_NEW)
	public Categoria salvar(Categoria e) throws FiegException {
		Categoria ret = null;
		try {
			return objJpaImp.salvar(e);
		} catch (Exception ex) {
			if (ex.getCause() instanceof PersistenceException) {
				throw new FiegException("Ja existe uma categoria com esta descrição");
			} else {
				throw new FiegException(ex);
			}
		}
	}

Arquivo de excessões

@SuppressWarnings("all")
public class FiegException extends RuntimeException {

	private static final long serialVersionUID = 1L;
	public static final String INFO = "info";
	public static final String ERROR = "error";

	public FiegException() {

	}

	public FiegException(final Exception msg) {
		super(msg);
	}

	public FiegException(final RuntimeException msg) {
		super(msg);
	}

	public FiegException(final RollbackException msg) {
		super(msg);
	}

	public FiegException(final PropertyAccessException msg) {
		super(msg);
	}

	public FiegException(final PersistentObjectException msg) {
		super(msg);
	}

	public FiegException(final String msg) {
		super(msg);
	}

	public FiegException(final String msg, final Throwable cause) {
		super(msg, cause);
	}

	public FiegException(final Throwable cause) {
		super(cause);
	}

	public FiegException(final FileNotFoundException cause) {
		super(cause);
	}

	public FiegException(final IOException cause) {
		super(cause);
	}

	public FiegException(final NoResultException cause) {
		super(cause);
	}

	public FiegException(final HibernateException cause) {
		super(cause);
	}

	public FiegException(final NoSuchAlgorithmException cause) {
		super(cause);
	}

	public FiegException(final UnsupportedEncodingException cause) {
		super(cause);
	}

	public FiegException(final MalformedURLException cause) {
		super(cause);
	}

	public FiegException(final SQLException cause) {
		super(cause);
	}

	public FiegException(final SQLGrammarException cause) {
		super(cause);
	}

	public FiegException(final JDBCException cause) {
		super(cause);
	}


	public FiegException(final Class clazz, final String message) {
		super(clazz.getName() + " : " + message);
	}

	public FiegException(final List<String> messages) {
		super(geMensagens(messages));
	}

	public static String geMensagens(final List<String> messages) {
		String msg = "";
		for (final String message : messages){
			msg += message + "\n";
		}
		return msg;
	}

	public String getNameException(){
		return FiegException.class.getSimpleName();
	}

	public Map<String, Object> getValueObject() {
		if (valueObject == null){
			valueObject = new HashMap<String, Object>();
		}
		return valueObject;
	}

	public void setValueObject(final Map<String, Object> valueObject) {
		this.valueObject = valueObject;
	}

	public void setErrorType(final String errorType){
		getValueObject().put(getNameException(), errorType);
	}

	public static void newInfo(final String mensagem){
		final FiegException be = new FiegException(mensagem);
		be.setErrorType(FiegException.INFO);
		throw be;
	}

	public FiegException(final DataIntegrityViolationException cause) {
		super(cause);
	}

	public FiegException(final PersistenceException cause) {
		super(cause);
	}

	public FiegException(final ConstraintViolationException cause) {
		super(cause);
	}

	public static void newError(final String mensagem){
		final FiegException be = new FiegException(mensagem);
		be.setErrorType(FiegException.ERROR);
		throw be;
	}

O problema é que a excessão é lançada na camada de negocio mas só na camada de controle que consigo captura-la, ja tentei colocar o conteudo da excessão que está atualmente no controlador na camada de negocio e o sistema simplesmente ignora e retorna para a view a excessão sem trata-la, como se não existisse o try. Alguma sugestão ?