对于大型项目,Spring Data JPA与Hibernate有何不同?

我很难决定是否应该继续使用Hibernate来完成一个新项目,或者使用JPA和新的Spring Data实现我的脚步。

Spring Data框架是否适用于大型项目或小型项目,并且查询要求不高?

尽管我通过使用@Query注释看到了代码减少的优势,但您对动态查询做了什么? 当你想实现一个非常复杂的save()方法时呢?

该文档说要制作一个定制界面和主存储库实现的实现,但如果您需要访问crud存储库本身的任何超级方法,该怎么办? 粗暴仓库实现了自定义的仓库 - 而不是其他方式。 这似乎是一个奇怪的设计。

我非常不确定这个框架是否能够应对复杂和大型应用的挑战。 我从来没有碰到过很多Hibernate的问题,我正在考虑坚持老的可靠的方法,而不是用Spring Data JPA。

我该怎么办? 如果我使用Spring Data JPA,会遇到哪些无法预料的复杂情况和成本?


因此, spring-data执行一些额外的功能,以帮助处理复杂的查询。 起初很奇怪,你完全在文档中跳过它,但它非常强大和有用。

它涉及到创建一个自定义的Repository和一个自定义的`RepositoryImpl',并告诉Spring在哪里找到它。 这里是一个例子:

配置类 - 指向您仍然需要的xml配置,注释指向您的存储库包(它现在会自动查找*Impl类):

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

jpa-repositories.xml - 告诉Spring哪里可以找到你的仓库。 同时告诉Spring使用CustomImpl文件名查找自定义存储库:

<?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 - 这是你可以放置带注释和不带注解的查询方法的地方。 请注意,此存储库接口如何扩展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 - 更复杂且无法用简单查询或注释处理的存储库方法:

public interface MyObjectRepositoryCustom {

    List<MyObject> findByNameWithWeirdOrdering(String name);
}

MyObjectRepositoryCustomImpl - 你实际用自动装配的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);
    }
}

令人惊讶的是,这一切都汇聚在一起,并且当你这样做时,来自两个界面(以及你实现的CRUD界面)的方法都显示出来:

myObjectRepository.

你会看见:

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

它真的有用。 你会得到一个用于查询的界面。 spring-data真的可以用于大型应用程序。 而更多的查询,你可以推入简单或注释只有你越好。

所有这些都记录在Spring Data Jpa网站上。

祝你好运。


我已经在具有简单查询需求的小型和大型项目中使用了Spring Data JPA。 主要优势在于甚至不必使用@Query注释。 Spring Data中没有任何内容阻止您在大型项目中使用它,最近的QueryDSL支持可能会对您有所帮助。 这是使用QueryDSL来定位Hibernate的一个例子。

如果您预见到复杂的查询,并且您觉得在不使用JPA的情况下使用Hibernate对象会更好,我认为另一种组合可以是使用您可能需要的特定方法在简单的Spring Data Repository旁边添加复杂的基于Hibernate的数据Repository 。 将Hibernate实现转换为Spring Data JPA结构可能不太麻烦。


Spring JPA将为您提供大量的使用查询方法声明编写SQL甚至某些HQL的抽象。 Spring JPA使用它的查询生成技术,但是当你想要一个纯粹的hibernate解决方案时,你可以根据需要进行定制,因为Spring JPA仍然基于hibernate。 查看文档http://static.springsource.org/spring-data/data-jpa/docs/current/reference/html了解更多信息。

链接地址: http://www.djcxy.com/p/7671.html

上一篇: How does Spring Data JPA differ from Hibernate for large projects?

下一篇: Dealing with "Xerces hell" in Java/Maven?