Na real, ao invés de vc usar um framework qualquer, vc usa um framework que implementa uma especificação.
Por exemplo:
Para visão vc usa JSF (Java Server Faces) que é uma especificação, e ai como implementação dessa especificação vc pode usar o myfaces, ai a menos que vc comece a usar coisas especificas do myfaces, a qualquer hora você pode jogar o myfaces fora e pegar outra lib que implementa a especificação JSF… se o myfaces for pro saco, você não vai se ferrar, porque é só pegar outra lib.
Para persistencia vc usa JPA (java persistence API), e ai como implementação dessa especificação pode usar o Hibernate ou TopLink, se você usar o hibernate, a menos que você crie coisas especificados que só o hibernate tem (por exemplo usar a api Criteria que ainda não existe no JPA), vc não vai estar dependente do hibernate, apenas da especificação JPA, e a qualquer momento pode mudar do hibernate para outro framework que implementa essa especificação.
Se quizer programar a parte de negócio com objetos distribuidos, usando vantagens como transação e segurança, vc usa EJB3 por exemplo. Caso você não use algo especifico de um servidor de aplicação, sua aplicação rodará em qualquer servidor de aplicação que implementa JEE (Jboss, Geronimo, WebSphere, BEA WebLogic, etc)
Se não quizer ficar dependente de um framework modinha, usa as especificações, elas fazem parte da api do java, ficar dependente delas não tem problema, pois elas vão evoluir junto com o java. Tenta mudar a cabeça do pessoal ai para ter essa visão.