Eu tenho um projeto no qual estou trabalhando atualmente usando Tomcat, Spring 4, Spring Security, MySQL e JPA com Hibernate.
Escolhi o JPA do ponto de vista de que é suposto tornar a troca da implementação subjacente dos fornecedores de ORM ininterrupta ou pelo menos menos dolorosa. Eu diria que isso é usar mentalmente a especificação sobre a implementação (JAX-RS) como ponto de vista padrão da comunidade de desenvolvimento Java.
Estou curioso para saber se essa é realmente uma tarefa que vale a pena realizar. Tenho certeza de que, se usasse o Hibernate diretamente, ganharia um pouco de energia, pois poderia usar recursos que não fazem parte da especificação principal do JPA.
Parte da minha preocupação vem da idéia de YAGNI. Estou essencialmente programando em um estilo e moda específicos (usando o JPA em vez do Hibernate) para que, em algum momento no futuro, eu possa trocar minha implementação do ORM. Duvido muito que isso aconteça ao longo da vida útil do produto, por isso estou me esforçando para algo que provavelmente nunca colherá os benefícios.
Quais são seus pensamentos? A "programação para a interface" vale a pena quando se trata de coisas como JPA? Você já trocou uma implementação inteira do ORM em um produto? Você já foi capaz de evitar completamente a abstração de algo como o JPA vazando? Pessoalmente, eu já tenho uma única chamada SQL nativa (para limpar as tabelas do banco de dados), e há algumas que eu gostaria de usar com as que estão incorporadas na especificação JPA (prefixos get / set para seus métodos e a diferença entre MEMBER OF / IN, que apenas me vinculando a uma implementação subjacente me dará alguma chance de evitar.