Spring Data JPA'nın büyük projeler için Hibernate'ten farkı nedir?


129

Yeni bir proje için Hibernate'e bağlı kalıp kalmamaya mı yoksa JPA ve yeni Spring Data uygulamasına ayaklarımı ıslatmaya mı karar vermekte zorlanıyorum.

Spring Data çerçevesi, büyük projeler veya mütevazı sorgu gereksinimleri olan küçük projeler için mi tasarlandı?

@QueryEk açıklamayı kullanarak kod azaltmanın avantajını kesinlikle görsem de, dinamik sorgular için ne yaparsınız? Oldukça karmaşık olan bir save () yöntemini ne zaman uygulamak istediğinize ne dersiniz?

Belgeler, ana deponuzun uyguladığı bir Özel arayüz ve uygulama yapmayı söylüyor, ancak ya crud deposundaki herhangi bir süper yönteme erişmeniz gerekirse? Crud deposu özel olanı uygular - tam tersi değil. Garip bir tasarım gibi görünüyor.

Bu çerçevenin karmaşık ve büyük uygulamaların zorluklarını karşılayıp karşılamayacağından çok emin değilim. Hibernate ile hiçbir zaman pek çok sorunla karşılaşmadım ve Spring Data JPA ile gitmek yerine eski güvenilir olana bağlı kalmayı düşünüyorum.

Ne yapmalıyım? Spring Data JPA ile devam edersem ne gibi öngörülemeyen komplikasyonlar ve maliyetlerle karşılaşacağım?


1
Bildiğim kadarıyla çok az fark yaratıyor. Daha rahat olduğunla git. Neden tartışma?
duffymo

1
Açıkçası Hibernate ile çok daha rahatım, ancak aynı şeyleri yapabilir ve daha üretken olursam, yeni yaklaşımları benimsemeyi tercih ederim. Ancak, Hibernate hala daha güçlüyse ve çok daha az sorunla karşılaşırsam, o zaman bu bilmek istediğim bir şeydir.
egervari

3
JPA, birçok uygulamadan biri olarak Hibernate'i kullanan bir ORM genellemesidir. Birine diğerine hangi yetkileri atfediyorsunuz? JPA bir standarttır, ancak ikisi arasında çok az fark görüyorum. Tam bir açıklama adına, ikisini de umursamadığımı söyleyeceğim. Her ikisi de sizin için SQL oluşturur. Kendim yazmayı tercih ederim. ORM, her problem ve her kullanıcı için değildir.
duffymo

1
Katılıyorum. Yalnızca JPA veya Hazırda Bekletme söz konusu olduğunda, her seferinde Hazırda Beklet'i seçerim. Dürüst olmak gerekirse tek başına JPA uygulamasını pek sevmiyorum. IDEA'daki IDE desteği aslında biraz kötüdür ve birim testlerinin çalışmasına izin vermek yerine uygulama başladığında eşleşmelerin doğru olmaması durumunda şikayet edecektir. JPA ile sahip olduğum bir sürü başka şey var. Aslında eski Hazırda Bekletme XML eşleme dosyalarından hoşlanıyorum. Nesnelerimin çok daha az dağınık görünmesini sağlama avantajına da sahiptir. Spring Data JPA birçok yeni özellik sunuyor, bu yüzden sonunda geçiş yapmaya değip değmeyeceğini merak ediyordum.
egervari

3
"Bahar Verileri", JPA'nın veya herhangi bir şeyin uygulaması değildir. Sadece mevcut bir JPA uygulamasını alır ve ona sağladığınız şeyi basitleştirir. JPA uygulaması hala tüm işleri kapaklar altında yapıyor
Neil Stockton

Yanıtlar:


104

Öyleyse, spring-datakarmaşık sorgulara yardımcı olan ekstra sihir var. İlk başta garip geliyor ve bunu belgelerde tamamen atlıyorsunuz ama gerçekten güçlü ve kullanışlıdır.

Özel Repositoryve özel bir `` RepositoryImpl '' oluşturmayı ve Spring'e onu nerede bulacağını söylemeyi içerir. İşte bir örnek:

Yapılandırma sınıfı - depolar paketinize işaret eden ek açıklama ile hala ihtiyaç duyduğunuz xml yapılandırmanıza işaret edin ( *Implşimdi sınıfları otomatik olarak arar ):

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

jpa-repositories.xml - depolarınızı Springnerede bulacağınızı söyleyin . Ayrıca dosya adına Springsahip özel depoları aramanızı söyleyin 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- Ek açıklamalı ve açıklamasız sorgu yöntemlerini koyabileceğiniz yer burasıdır. Bu depo arayüzünün aşağıdakileri nasıl genişlettiğine dikkat edin 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 - daha karmaşık olan ve basit bir sorgu veya ek açıklama ile ele alınamayan depo yöntemleri:

public interface MyObjectRepositoryCustom {

    List<MyObject> findByNameWithWeirdOrdering(String name);
}

MyObjectRepositoryCustomImpl- bu yöntemleri bir otomatik kablolama ile gerçekten uyguladığınız yer 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);
    }
}

Şaşırtıcı bir şekilde, bunların hepsi bir araya gelir ve her iki arayüzden (ve uyguladığınız CRUD arayüzünden) gelen yöntemlerin tümü şunları yaptığınızda görünür:

myObjectRepository.

Göreceksin:

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

Gerçekten işe yarıyor. Ve sorgulama için bir arayüz elde edersiniz. spring-datagerçekten büyük bir uygulamaya hazır. Ve basit veya ek açıklamaya ne kadar çok sorgu gönderebilirseniz, durumunuz o kadar iyi olur.

Tüm bunlar Spring Data Jpa sitesinde belgelenmiştir .

İyi şanslar.


4
Bu aslında denediğim şey ve bir ölçüde işe yarıyor. Karşılaştığım sorun, eğer save () 'i geçersiz kılmak isterseniz ne olacak? Örneğin, bir blogu kaydettiğinizi ve bununla ilişkili etiketleri bir hizmete koymak çok mantıklı olmadığı için save () yönteminde işlemek / kaydetmek istediğinizi hayal edin. Bunu ham Hibernate ile yapmak kolaydır, ancak Spring JPA ile yapmanın iyi bir yolunu göremiyorum. Yine de cevabınızı doğru olarak işaretleyeceğim çünkü doğru. Spring Data JPA ile yapabilecekleriniz temelde budur. Sanırım Hibernate'e bağlı kalacağım. Bu cevap kesinlikle başkalarına yardımcı olacaktır.
egervari

8
Kendi JpaRepository-> ' nizi uygulayabilirsiniz MyJpaRepository. Ayrıca bir de oluşturmanız gerekir, MyJpaRepositoryFactoryBeanancak hepsini doğru bir şekilde ayarlarsanız, .save () yöntemini geçersiz kılabilirsiniz. İşte Bahar Verileri JPA Belgeleri: static.springsource.org/spring-data/data-jpa/docs/current/… Henüz pes etmeyin!
sbzoom

@Picrochole 'alt uygulama katmanını' nasıl yorumluyorsunuz? DAO'yu çağıran servis, katman olarak daha mı düşük?
Rumid

12

Spring Data JPA'yı basit sorgu talepleri olan küçük ve büyük projelerde kullandım. En büyük avantajı, @Queryaçıklamayı kullanmak zorunda kalmamaktır . Spring Data'da onu büyük projelerde kullanmanızı engelleyen hiçbir şey yoktur ve son QueryDSLdestek size yardımcı olabilir. Bu, Hazırda Bekletme'yi hedeflemek için QueryDSL kullanımına bir örnektir .

Karmaşık sorgular öngörüyorsanız ve JPA olmadan Hazırda Beklet nesnelerini kullanmakta kendinizi rahat hissediyorsanız, alternatif bir kombinasyon, Repositoryihtiyaç duyabileceğiniz belirli yöntemlerle karmaşık Hazırda Bekletme tabanlı olanların yanında basit Spring Verilerine sahip olmak olabilir. Bir Hibernate uygulamasını Spring Data JPA yapısına çevirmek daha az külfetli olabilir.


2
Sanırım aynı projede karıştırmak ve eşleştirmek yerine sorgular için aynı tutarlı API'yi kullanmayı tercih ederim. Karmaşık yay verileri jpa şeyler için hala iyi bir çözüm bulamadım ve genel olarak sahip olduğum jpa ile ilgili epeyce nitpicks olduğundan, hazırda bekletmeyi ormum olarak kabul etmekten daha mutlu olabileceğimi düşünüyorum. Çok sayıda karmaşık sorguya sahip olacağım ve 40/60 karışımına sahip olamayacağım. Benim için buna değmez :(
egervari

1
Ayrıca, Querydsl'i, JPA'nın üzerinde tek bir güçlü sorgu katmanı sağlayan Spring Data olmadan da kullanabilirsiniz.
Timo Westkämper

4

Spring JPA, sorgu yöntemi bildirimi kullanarak SQL yazmaktan ve hatta bazı HQL'den çok fazla soyutlama sağlayacaktır. Spring JPA, sorgu oluşturma ile parlıyor, ancak tamamen hazırda bekletme çözümü istediğinizde, bahar JPA hala hazırda beklemeye dayandığından, gerektiği gibi özelleştirebilirsiniz. Daha fazla bilgi için http://static.springsource.org/spring-data/data-jpa/docs/current/reference/html dokümanlarına bakın.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.