2013-09-06 14 views
9

Przykład pliku konfiguracyjnego wiosna:JPA dostawca vs. dialekcie vs. sprzedawca w konfiguracji Wiosna contaniner

<bean id="jpaDialect" class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"/> 

<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"> 
    <property name="entityManagerFactory"ref="entityManagerFactory"/> 
    <property name="jpaDialect"ref="jpaDialect"/> 
</bean> 

<bean id="emf" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> 
    <property name="jpaVendorAdapter"> 
     <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter" /> 
    </property> 
.... 
</bean> 

i pliku persistence.xml JPA:

<persistence-unit name="EmployeeService"> 
    <provider>org.hibernate.ejb.HibernatePersistence</provider> 
</persistence-unit> 

Jak widać WZP informacje związane z dostawcą są ustawiane 3 razy. W transakcji menedżera fasoli, kierownik podmiotu fabrycznego fasoli i konfiguracji urządzenia Trwałość:

<property name="jpaDialect"ref="jpaDialect"/> 
... 
<property name="jpaVendorAdapter"> 
    <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter" /> 
</property> 
... 
<provider>org.hibernate.ejb.HibernatePersistence</provider> 

Ale faktycznie w moim projekcie skonfigurowany tylko jednostki trwałości z dostawcą. I zadziałało.

Moje pytanie brzmi: jaka jest różnica między opcjami dostawcy, dialektu i dostawcy? Czy muszę ustawić wszystkie z nich, czy mogę pominąć niektóre z nich? Czy mogę ustawić, na przykład jako dostawca dla EntityMangerFactory - Hibernate, jako dialekt w menedżerze transakcji - Eclipse i jako dostawca w konfiguracji jednostek wytrwałości - na przykład coś innego, TopLink.

Nie jest dla mnie jasne. Proszę wytłumacz.

Odpowiedz

11

spróbuje wytłumaczyć wiersz po wierszu:

<bean id="jpaDialect" class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"/> 

//Should ideally be 
<bean id="jpaDialect" class="org.springframework.orm.jpa.vendor.HibernateJpaDialect"/> 
  • Ta fasola definiuje jpaDialect że masz zamiar używać. JpaDialect to interfejs zawierający pewne funkcje, których nie oferuje standard JPA 1.0, na przykład dostęp do podstawowego połączenia JDBC. Ta strategia jest przeznaczona głównie do samodzielnego korzystania z dostawcy JPA; większość jego funkcji nie jest istotna podczas uruchamiania z transakcjami JTA. Umożliwia również udostępnienie metod wartości dodanej dla przenośnych, ale jeszcze bardziej wydajnych podinterfejsów EntityManager i EntityManagerFactory oferowanych przez Spring.
  • Od podałeś klasy jako class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"/> pozwala to Spring podłączyć zachowań specyficznych dla dostawcy do EntityManagerFactory twórców wiosnę i służy jako pojedynczy punkt konfiguracji wszystkich specyficznych dla dostawcy properties.It w implementacji niestandardowych wiosny własnego JpaVendorAdapter.

Na drugim fasoli gdzie masz zadeklarowanego:

<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"> 
    <property name="entityManagerFactory"ref="entityManagerFactory"/> 
    <property name="jpaDialect"ref="jpaDialect"/> 
</bean> 
  • powiedzieć 'Wiosna', aby skonfigurować transactionManager którego właściwości są entityManagerFactory i jpaDialect. Ponieważ te właściwości muszą być specyficzne dla hibernate, są one ustawione zgodnie z ustawieniem. Modele entityManagerFactory i jpaDialect są teraz ustawione specjalnie na hibernate (lub Vendor).

Co do trzeciego fasoli

<property name="jpaDialect"ref="jpaDialect"/> 
... 
<property name="jpaVendorAdapter"> 
    <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter" /> 
</property> 
... 
<provider>org.hibernate.ejb.HibernatePersistence</provider> 

<provider> mówi wiosny do używania dostawcy hibernate i klasy org.hibernate.ejb.HibernatePersistence EJB3 Hibernacja jest realizacja dostawca wytrwałość.

Krótko mówiąc, musisz je skonfigurować, aby poinformować wiosnę, która funkcja ORM powinna być użyta.

Powodem, dla którego aplikacja działała przy konfigurowaniu trwałości i dostawcy, jest to, że adapter dostawcy automatycznie przeszedł podaną trwałość, tj. HibernatePersistence, poprzez getPersistenceProvider w JpaVendorAdapter.

Tinker wokół dokumentacji, aby zrozumieć, w jaki sposób te klasy są ze sobą powiązane.

EDIT: Jak podkreślił @TheKojuEffect pierwszy fasola powinna być idealnie w formie:

<bean id="jpaDialect" class="org.springframework.orm.jpa.vendor.HibernateJpaDialect"/> 

Dzięki. Nieodebrane vendorAdapter.

Można odwołać:

Nadzieję, że to pomaga. :)

+0

Niezłe wyjaśnienie, ale myślę, że popełniłeś błąd w swojej odpowiedzi. W pierwszym komponencie 'jpaDialect', myślę, że chodziło Ci o' jpaVendorAdapter'. Byłoby lepiej, gdybyś poprawił swoją odpowiedź. – TheKojuEffect

+0

Dzięki za odpowiedź. Przejrzałem HibernateJpaVendorAdapter i znalazłem metody getJpaDialect() i getPersistenceProvider(). Myślę, że byłoby to właściwe, aby skonfigurować fabrykę menedżerów encji tylko za pomocą HibernateJpaVendorAdapter. I to wystarczy, ponieważ zarówno dialer jpa, jak i dostawca jpa mogą być odbierane z klasy adaptera. – Alexandr

Powiązane problemy