2012-10-08 65 views
108

我很難決定是否應該繼續使用Hibernate來完成一個新項目,或者使用JPA和新的Spring Data實現讓自己的工作變得更加輕鬆。對於大型項目,Spring Data JPA與Hibernate有何不同?

Spring Data框架是否適用於大型項目或具有適度查詢要求的小型項目?

儘管我通過使用@Query註釋看到了代碼縮減的優勢,但您對動態查詢有什麼作用?當你想實現一個非常複雜的save()方法時呢?

該文檔說要製作一個自定義界面和主存儲庫實現的實現,但如果您需要訪問crud存儲庫本身的任何超級方法,該怎麼辦?粗暴倉庫實現了自定義的倉庫 - 而不是其他方式。這似乎是一個奇怪的設計。

我非常不確定這個框架是否能夠應對複雜和大型應用的挑戰。我從來沒有碰到過很多Hibernate的問題,我正在考慮堅持老的可靠的方法,而不是用Spring Data JPA。

我該怎麼辦?如果我使用Spring Data JPA,會遇到哪些無法預料的複雜情況和成本?

+1

據我所知,它沒有什麼區別。跟你更舒服的那個一起去吧。爲什麼辯論? – duffymo

+1

我顯然對Hibernate更加熟悉,但如果我可以做同樣的事情並提高生產力,我寧願採用更新的方法。但是,如果Hibernate的功能更強大,我會遇到更少的問題,那麼這是我想知道的。 – egervari

+2

JPA是使用Hibernate作爲衆多實現之一的ORM的泛化。你有什麼權力歸屬於彼此? JPA是一個標準,但我看不出兩者之間的區別。爲了充分披露,我會說我不關心任何一個。兩者都爲你生成SQL。我寧願自己寫。 ORM並非針對每個問題和每個用戶。 – duffymo

回答

91

因此,spring-data做了一些額外的魔法,可以幫助處理複雜的查詢。起初很奇怪,你完全在文檔中跳過它,但它非常強大和有用。

它涉及到創建一個自定義Repository和一個自定義`RepositoryImpl'並告訴Spring在哪裏找到它。這裏有一個例子:

配置類 - 點到你仍然需要XML配置與註釋指向您的倉庫包(它看起來*Impl類自動至今):

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

JPA的資料庫.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 site

祝你好運。

+4

這實際上是我試過的,它在某種程度上起作用。如果你想重寫save()?例如,假設你正在保存一個博客,並且你想在save()方法中處理/保存與它相關的標記,因爲把它放到一個服務中並不會使這對於原始Hibernate來說很容易,但是我沒有看到用Spring JPA做的一個好方法,但我會將你的答案標記爲正確的,因爲它是正確的,基本上你可以用Spring做什麼Data JPA。我想我會堅持使用Hibernate。這個答案肯定會對其他人有所幫助。 – egervari

+8

你可以實現你自己的'JpaRepository' - >'MyJpaRepository'。你還必須創建一個'MyJpaRepositoryFactoryBean',但是如果你設置了所有的正確地,你可以覆蓋.sa ve()方法。這裏是Spring Data JPA Docs:http://static.springsource.org/spring-data/data-jpa/docs/current/reference/html/#repositories.custom-behaviour-for-all-repositories不要給剛剛還沒有! – sbzoom

+0

@Picrochole你如何解釋'較低層次的應用'?服務是否叫DAO更低? – Rumid

9

我已經在具有簡單查詢需求的小型和大型項目中使用了Spring Data JPA。主要優勢在於不需要使用@Query註釋。 Spring Data中沒有任何內容阻止您在大型項目中使用它,最近的支持可能會對您有所幫助。使用QueryDSL來定位Hibernate的This is an example

如果你預見覆雜的查詢,你使用Hibernate對象,而JPA感覺很舒服,我認爲替代組合可以有簡單的Spring數據Repository的下一個複雜的Hibernate基於那些你可能需要的具體方法。將Hibernate實現轉換爲Spring Data JPA結構可能不太麻煩。

+2

我想我寧願使用相同的一致的api查詢,而不是在同一個項目中進行混合和匹配。我仍然沒有找到複雜的彈簧數據jpa東西的一個很好的解決方案,並且由於jpa中有很多我一般都會遇到的挑戰,我想我可能會更快樂地接受hibernate作爲我的orm。我會有很多複雜的疑問,而且我不能擁有40/60的混合物。這是不值得的對我:( – egervari

+1

你也可以直接使用Querydsl沒有Spring Data,它給你一個強大的JPA查詢層 –

相關問題