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?
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?
Respostas:
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 GenericDao
implementaçõ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 @Transactional
anotaçã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.
Existem três coisas diferentes que estamos usando aqui:
Então, vamos entender como jpa dados primavera e primavera + hibernate obras-
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.
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:
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 :)
Spring Data
é uma biblioteca de conveniência JPA
que 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 JPA
consultas apropriadas .
Sua colocação no topo JPA
faz com que seu uso seja tentador para:
Desenvolvedores novatos que não o conhecem SQL
ou o conhecem mal. Esta é uma receita para o desastre, mas eles podem se safar se o projeto for trivial.
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 Spring
em 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.
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.
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.