Como o JPA do Spring Data difere do Hibernate para grandes projetos?

129

Estou com dificuldades para decidir se devo continuar com o Hibernate para um novo projeto ou se me molhar com o JPA e a nova implementação do Spring Data.

A estrutura do Spring Data é destinada a projetos grandes ou pequenos com requisitos de consulta modestos?

Embora eu certamente veja a vantagem na redução de código usando a @Queryanotação, o que você faz para consultas dinâmicas? E quando você deseja implementar um método save () bastante complexo?

A documentação diz para criar uma interface e implementação personalizadas que seu repositório principal implementa, mas e se você precisar acessar algum super método no próprio repositório crud? O repositório crud implementa o personalizado - e não o contrário. Parece um design estranho.

Estou muito incerto se essa estrutura atenderá aos desafios de aplicativos complexos e grandes. Eu nunca tive muitos problemas com o Hibernate, e estou pensando em manter a boa e velha confiabilidade, em vez de ir com o Spring Data JPA.

O que devo fazer? Quais complicações e custos imprevistos vou encontrar se eu for com o Spring Data JPA?

egervari
fonte
1
Até onde eu sei, faz pouca diferença. Vá com o que você está mais confortável. Por que o debate?
Duffymo 8/10
1
Obviamente, estou muito mais confortável com o Hibernate, mas se posso fazer as mesmas coisas e ser mais produtivo, prefiro adotar as novas abordagens. No entanto, se o Hibernate ainda for mais poderoso e eu encontrar muito menos problemas, é algo que eu gostaria de saber.
Egervári
3
JPA é uma generalização do ORM que usa o Hibernate como uma das muitas implementações. Que poderes você está atribuindo a um sobre o outro? JPA é um padrão, mas vejo pouca diferença entre os dois. No interesse da divulgação completa, direi que não me importo com nenhuma delas. Ambos geram SQL para você. Prefiro escrever sozinho. ORM não é para todos os problemas e todos os usuários.
Duffymo
1
Concordo. Quando se trata apenas de JPA ou Hibernate, eu sempre escolhia o Hibernate. Sinceramente, não gosto muito da implementação da JPA por conta própria. O suporte ao IDE no IDEA ainda é meio ruim, e ele reclamará se os mapeamentos não estiverem corretos quando o aplicativo iniciar, em vez de permitir que os testes de unidade sejam executados. Há muitos outros truques que tenho com o JPA. Na verdade, eu meio que aprecio os antigos arquivos de mapeamento XML do Hibernate. Tem a vantagem de fazer meus objetos parecerem muito menos confusos também. O Spring Data JPA oferece muitos recursos novos, então eu finalmente estava pensando se vale a pena mudar.
egervari 9/10/12
3
"Spring Data" não é uma implementação da JPA, nem nada. Simplesmente pega uma implementação de JPA existente e simplifica o que você fornece a ela. A implementação da JPA ainda faz todo o trabalho oculto
Neil Stockton

Respostas:

104

Então, spring-datafaz alguma mágica extra que ajuda com consultas complexas. É estranho no começo e você pula totalmente nos documentos, mas é realmente poderoso e útil.

Envolve criar um personalizado Repositorye um personalizado `RepositoryImpl 'e dizer ao Spring onde encontrá-lo. Aqui está um exemplo:

Classe de configuração - aponte para sua configuração xml ainda necessária com a anotação apontando para o pacote de repositórios (ele procura *Implclasses automaticamente agora):

@Configuration
@EnableJpaRepositories(basePackages = {"com.examples.repositories"})
@EnableTransactionManagement
public class MyConfiguration {
}

jpa-repositories.xml - diga Springonde encontrar seus repositórios. Diga também Springpara procurar repositórios personalizados com o CustomImplnome do arquivo:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:jpa="http://www.springframework.org/schema/data/jpa"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:util="http://www.springframework.org/schema/util"
xsi:schemaLocation="http://www.springframework.org/schema/data/mongo http://www.springframework.org/schema/data/jpa/spring-jpa.xsd
    http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
    http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd">

<jpa:repositories base-package="com.example.repositories" repository-impl-postfix="CustomImpl" />

</beans>

MyObjectRepository- é aqui que você pode colocar métodos de consulta anotados e não anotados. Observe como essa interface do repositório estende a seguinte Custom:

@Transactional
public interface MyObjectRepository extends JpaRepository<MyObject, Integer>, MyObjectRepositoryCustom {

    List<MyObject> findByName(String name);

    @Query("select * from my_object where name = ?0 or middle_name = ?0")
    List<MyObject> findByFirstNameOrMiddleName(String name);
}

MyObjectRepositoryCustom - métodos de repositório que são mais complexos e não podem ser manipulados com uma consulta simples ou uma anotação:

public interface MyObjectRepositoryCustom {

    List<MyObject> findByNameWithWeirdOrdering(String name);
}

MyObjectRepositoryCustomImpl- onde você realmente implementa esses métodos com uma conexão automática EntityManager:

public class MyObjectRepositoryCustomImpl implements MyObjectRepositoryCustom {

    @Autowired
    private EntityManager entityManager;

    public final List<MyObject> findByNameWithWeirdOrdering(String name) {
        Query query = query(where("name").is(name));
        query.sort().on("whatever", Order.ASC);
        return entityManager.find(query, MyObject.class);
    }
}

Surpreendentemente, tudo isso se junta e os métodos de ambas as interfaces (e a interface CRUD que você implementa) aparecem quando você faz:

myObjectRepository.

Você verá:

myObjectRepository.save()
myObjectRepository.findAll()
myObjectRepository.findByName()
myObjectRepository.findByFirstNameOrMiddleName()
myObjectRepository.findByNameWithWeirdOrdering()

Realmente funciona. E você obtém uma interface para consulta. spring-dataestá realmente pronto para uma aplicação grande. E quanto mais consultas você puder inserir em anotações simples ou apenas o melhor para você.

Tudo isso está documentado no site Spring Data Jpa .

Boa sorte.

sbzoom
fonte
4
Isso é realmente o que eu tentei, e funciona até certo ponto. O problema que tive é o que se você deseja substituir save ()? Por exemplo, imagine que você está salvando um blog e deseja processar / salvar as tags associadas a ele no método save (), pois colocá-lo em um serviço não faz mais sentido. Isso é fácil de fazer com o Hibernate bruto, mas não vejo uma boa maneira de fazer com o Spring JPA. Vou marcar sua resposta como correta, porque está correta. Isso é basicamente o que você pode fazer com o Spring Data JPA. Acho que vou ficar com o Hibernate. Esta resposta definitivamente ajudará os outros.
Egervári
8
Você pode implementar o seu próprio JpaRepository-> MyJpaRepository. Você também deve criar um MyJpaRepositoryFactoryBeanmas, se configurar tudo corretamente, poderá substituir o método .save (). Aqui estão os documentos JPA do Spring Data: static.springsource.org/spring-data/data-jpa/docs/current/… Não desista ainda!
Sbzoom 10/10/12
@ Picrochole, como você interpreta 'nível inferior de aplicativo'? O serviço, que chama o DAO, é mais baixo?
Rumid
12

Eu usei o Spring Data JPA em projetos pequenos e grandes com demandas de consulta simples. A principal vantagem é não ter que usar a @Queryanotação. Não há nada no Spring Data que o impeça de usá-lo em grandes projetos, e o QueryDSLsuporte recente pode ajudá-lo. Este é um exemplo do uso do QueryDSL para direcionar o Hibernate.

Se você prevê consultas complexas e se sente à vontade usando objetos do Hibernate sem JPA, acho que uma combinação alternativa poderia ser ter os dados simples do Spring Repositoryao lado dos complexos baseados no Hibernate com os métodos específicos que você pode precisar. Pode ser menos complicado que distorcer uma implementação do Hibernate na estrutura JPA do Spring Data.

madth3
fonte
2
Eu acho que prefiro usar a mesma API consistente para consultas, em vez de misturar e combinar no mesmo projeto. Ainda não encontrei uma boa solução para as coisas complexas do jpa de dados da primavera, e como há muitos truques com o jpa que eu tenho em geral, acho que posso ficar mais feliz em aceitar o hibernate como minha organização. Terei muitas consultas complexas e não posso me dar ao luxo de ter uma mistura 40/60. Não vale a pena para mim :(
egervari
1
Você também pode usar o Querydsl diretamente sem o Spring Data, que fornece uma única camada de consulta poderosa sobre a JPA.
Timo Westkämper 10/10/12
4

O Spring JPA fornecerá muita abstração ao escrever SQL e até alguns HQL usando a declaração do método de consulta. O Spring JPA brilha com sua geração de consulta, mas quando você deseja uma solução puramente hibernada, pode personalizar conforme necessário, pois o Spring JPA ainda é baseado no hibernação. Verifique os documentos http://static.springsource.org/spring-data/data-jpa/docs/current/reference/html para obter mais informações.

FOO
fonte