Qual é a diferença entre Hibernate e Spring Data JPA

207

Quais são as principais diferenças entre o Hibernate e o Spring Data JPA? Quando não devemos usar o Hibernate ou o Spring Data JPA? Além disso, quando o modelo Spring JDBC pode ter um desempenho melhor que o Hibernate / Spring Data JPA?

codificador rígido
fonte
7
@NeilStockton pedir uma comparação entre duas tecnologias não está pedindo opiniões.
Philip Rego

Respostas:

262

O Hibernate é uma implementação JPA, enquanto o Spring Data JPA é uma abstração de acesso a dados JPA. O Spring Data JPA não pode funcionar sem um provedor de JPA.

O Spring Data oferece uma solução para o padrão DDDRepository ou para as GenericDaoimplementações personalizadas herdadas . Também pode gerar consultas JPA em seu nome por meio de convenções de nome de método.

Com o Spring Data, você pode usar o Hibernate, o Eclipse Link ou qualquer outro provedor de JPA. Um benefício muito interessante do uso do Spring ou Java EE é que você pode controlar os limites da transação declarativamente usando a @Transactionalanotação .

O Spring JDBC é muito mais leve e destina-se à consulta nativa; se você pretende usar apenas o JDBC sozinho, é melhor usar o Spring JDBC para lidar com a verbosidade do JDBC.

Portanto, o Hibernate e o Spring Data são complementares e não concorrentes.

Vlad Mihalcea
fonte
53
Então, isso significa que o Spring Data JPA não pode existir por si só? Ou seja, sob o capô, ele usa um fornecedor de JPA (como Hibernate, Eclipselink ou qualquer outro fornecedor de JPA)?
CuriousMind
Quero dizer, se eu usar apenas hibernação, haverá pouca configuração para o nível de hibernação. Se eu usar o jpa de dados de primavera, isso parecerá muito mais fácil que o hibernação. Nesse sentido, fiz essa pergunta.
Asif Mushtaq
1
Mais precisamente, até agora tudo funciona bem, você só precisa entender o nível superior, ou seja, o Spring Data JPA. Com a primeira exceção, você potencialmente precisa conhecer os níveis mais baixos, como Hibernate, JDBC e o banco de dados.
Marmite Bomber
138

Existem três coisas diferentes que estamos usando aqui:

  1. JPA: API de persistência Java que fornece especificação para persistir, ler, gerenciar dados do seu objeto java para as relações no banco de dados.
  2. Hibernação: Existem vários provedores que implementam o jpa. Hibernate é um deles. Portanto, temos outro provedor também. Mas se você usar o jpa com spring, poderá mudar para diferentes fornecedores no futuro.
  3. Dados da primavera JPA: Essa é outra camada sobre o jpa que a primavera fornece para facilitar sua vida.

Então, vamos entender como jpa dados primavera e primavera + hibernate obras-


Dados da Primavera JPA:

Digamos que você esteja usando o spring + hibernate para o seu aplicativo. Agora você precisa ter uma interface e implementação dao em que estará escrevendo a operação crud usando o SessionFactory do hibernate. Digamos que você esteja escrevendo a classe dao para a classe Employee, amanhã no seu aplicativo talvez seja necessário gravar uma operação similar para qualquer outra entidade. Portanto, há muito código padrão que podemos ver aqui.

Agora, o Spring data jpa nos permite definir interfaces dao, estendendo seus repositórios (repositório de dados, repositório de amostras), para que você forneça a implementação de dao em tempo de execução. Você não precisa mais escrever a implementação dao. É assim que o Spring Data Jpa facilita sua vida.

Bhagwati Malav
fonte
3
Então, qual é a implementação subjacente do Spring Data JPA, é hibernar, porque quando eu uso PagingAndSortingRepository, ele mostra os logs do Hibernate no console.
Vicky
2
Primavera de dados JPA usado implementação Hibernate por padrão .. Se você ver as dependências transitivas de-Boot-arranque-dados primavera-jpa, você pode ver hibernate-core lá
IamVickyAV
28

Eu discordo SpringJPA facilita a vida. Sim, ele fornece algumas classes e você pode executar o DAO rapidamente, mas, na verdade, é tudo o que você pode fazer. Se você quiser fazer algo mais do que findById () ou salvar, deve passar pelo inferno:

  • nenhum acesso ao EntityManager nas classes org.springframework.data.repository (essa é a classe JPA básica!)
  • próprio gerenciamento de transações (transações de hibernação não permitidas)
  • enormes problemas com mais de uma configuração de fontes de dados
  • nenhum pool de fontes de dados (o HikariCP deve estar em uso como biblioteca de terceiros)

Por que o gerenciamento de transações próprias é uma desvantagem? Como o Java 1.8 permite métodos padrão nas interfaces, transações baseadas em anotações do Spring, simple não funcionam.

Infelizmente, o SpringJPA é baseado em reflexões e, às vezes, você precisa apontar um nome de método ou pacote de entidade para as anotações (!). É por isso que qualquer refatoração causa um grande acidente. Infelizmente, o @Transactional funciona apenas para o DS primário :( Então, se você tiver mais de um DataSources, lembre-se - as transações funcionam apenas para o primário :)

Quais são as principais diferenças entre o Hibernate e o Spring Data JPA?

O Hibernate é compatível com JPA, SpringJPA Spring. O HibernateJPA DAO pode ser usado com JavaEE ou Hibernate Standalone, quando o SpringJPA pode ser usado no Spring - SpringBoot por exemplo

Quando não devemos usar o Hibernate ou o Spring Data JPA? Além disso, quando o modelo Spring JDBC pode ter um desempenho melhor que o Hibernate / Spring Data JPA?

Use o Spring JDBC apenas quando precisar usar muitas associações ou quando precisar usar o Spring com várias conexões de fonte de dados. Geralmente, evite o JPA para associações.

Mas meu conselho geral, use uma solução nova - Daobab ( http://www.daobab.io ). O Daobab é meu Java e qualquer integrador de mecanismo JPA, e acredito que ajudará muito em suas tarefas :)

Klaudiusz Wojtkowiak
fonte
2
Daobab, sério? Se você não gosta do tipo segurança do tipo jpql (eu não gosto), o JPA possui uma API de critérios de segurança de tipo ... O JPA padrão é melhor do que a pobre alternativa.
ymajoros 25/01/19
8

Spring Dataé uma biblioteca de conveniência JPAque abstrai muitas coisas e traz a magia do Spring (goste ou não) para o acesso à loja de persistência. É usado principalmente para trabalhar com bancos de dados relacionais. Em suma, permite declarar interfaces que possuem métodos como findByNameOrderByAge(String name);esse serão analisadas em tempo de execução e convertidas em JPAconsultas apropriadas .

Sua colocação no topo JPAfaz com que seu uso seja tentador para:

  1. Desenvolvedores novatos que não o conhecem SQLou o conhecem mal. Esta é uma receita para o desastre, mas eles podem se safar se o projeto for trivial.

  2. Engenheiros experientes que sabem o que fazem e desejam acelerar as coisas rapidamente. Esta pode ser uma estratégia viável (mas leia mais).

Da minha experiência com Spring Data , sua mágica é demais (isso é aplicável Springem geral). Comecei a usá-lo intensamente em um projeto e acabei atingindo vários casos de esquina onde não conseguia tirar a biblioteca do caminho e acabei com soluções feias. Mais tarde, li as reclamações de outros usuários e percebi que esses problemas são comuns Spring Data. Por exemplo, verifique esse problema que levou a horas de investigação / juramento:

 public TourAccommodationRate createTourAccommodationRate(
        @RequestBody TourAccommodationRate tourAccommodationRate
    ) {
        if (tourAccommodationRate.getId() != null) {
            throw new BadRequestException("id MUST NOT be specified in a body during entry creation");
        }

        // This is an ugly hack required for the Room slim model to work. The problem stems from the fact that
        // when we send a child entity having the many-to-many (M:N) relation to the containing entity, its
        // information is not fetched. As a result, we get NPEs when trying to access all but its Id in the
        // code creating the corresponding slim model. By detaching the entity from the persistence context we
        // force the ORM to re-fetch it from the database instead of taking it from the cache

        tourAccommodationRateRepository.save(tourAccommodationRate);
        entityManager.detach(tourAccommodationRate);
        return tourAccommodationRateRepository.findOne(tourAccommodationRate.getId());
    }

Acabei indo para um nível mais baixo e comecei a usar JDBI- uma boa biblioteca com apenas "mágica" suficiente para salvá-lo do clichê. Com ele, você tem controle total sobre as consultas SQL e quase nunca precisa combater a biblioteca.

raias
fonte
esta é uma boa resposta, mas se você puder listar as caixas de canto e detalhar mais, será muito útil. Vai se tornar uma ótima resposta. Obrigado
John
Bem, não é tão fácil relembrar aqueles dados que eu não trabalho com o Spring Data há um bom tempo - terei que revisar o código antigo e adicionar mais comentários. No entanto, um dos aborrecimentos diretamente da minha cabeça - na JPA, com frequência, os objetos precisam se referir um ao outro (por exemplo, para operações em cascata). Isso causa um erro de estouro de pilha (devido a referências circulares) quando o Spring tenta serializá-las, forçando-o a resolver problemas / soluções alternativas feias. Esse problema é tangencial ao Spring Data, porque é um problema de JPA. No entanto, como o JPA está subjacente ao Spring Data, você o obtém "de graça".
raiks 14/01
Editou a postagem e adicionou mais um exemplo.
raiks 14/01
1

O Hibernate é a implementação do "JPA", que é uma especificação para objetos Java no Banco de Dados.

Eu recomendaria usar o JPA wrt, pois você pode alternar entre diferentes ORMS.

Ao usar o JDBC, você precisará usar as Consultas SQL; portanto, se você é proficiente em SQL, escolha JDBC.

Thoopalliamar
fonte
1

Se você preferir simplicidade e mais controle nas consultas SQL, sugiro usar o Spring Data / Spring JDBC.

É uma boa quantidade de curva de aprendizado na JPA e às vezes é difícil depurar problemas. Por outro lado, enquanto você tem controle total sobre o SQL, fica muito mais fácil otimizar a consulta e melhorar o desempenho. Você pode compartilhar facilmente seu SQL com o DBA ou com alguém que tenha uma melhor compreensão do Banco de Dados.

GPopat
fonte