БпСцификация JPA Π² Spring, доступная Π² ΠΏΠ°ΠΊΠ΅Ρ‚Π΅ org.springframework.orm.jpa, содСрТит комплСксныС срСдства ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΈ Java Persistence API Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½ΠΎ ΠΈΠ½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΠΈ с Hibernate, ΠΏΡ€ΠΈ этом учитывая Π±Π°Π·ΠΎΠ²ΡƒΡŽ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ для прСдоставлСния Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ.

Π’Ρ€ΠΈ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π° настройки JPA Π² ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠΈ Spring

ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° JPA Π² Spring ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π΅Ρ‚ Ρ‚Ρ€ΠΈ способа настройки EntityManagerFactory ΠΈΠ· JPA, которая ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΠΌ для получСния диспСтчСра сущностСй.

  • ИспользованиС LocalEntityManagerFactoryBean

  • ΠŸΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ EntityManagerFactory ΠΈΠ· JNDI

  • ИспользованиС LocalContainerEntityManagerFactoryBean

ИспользованиС LocalEntityManagerFactoryBean

Π­Ρ‚ΠΎΡ‚ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² простых окруТСниях развСртывания, Ρ‚Π°ΠΊΠΈΡ… ΠΊΠ°ΠΊ Π°Π²Ρ‚ΠΎΠ½ΠΎΠΌΠ½Ρ‹Π΅ прилоТСния ΠΈ ΠΈΠ½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΠΎΠ½Π½Ρ‹Π΅ тСсты.

LocalEntityManagerFactoryBean создаСт Ρ„Π°Π±Ρ€ΠΈΠΊΡƒ EntityManagerFactory, ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΡΡ‰ΡƒΡŽ для простых ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠΉ развСртывания, Π³Π΄Π΅ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ JPA для доступа ΠΊ Π΄Π°Π½Π½Ρ‹ΠΌ. Π‘ΠΈΠ½-Ρ„Π°Π±Ρ€ΠΈΠΊΠ° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ автоматичСского опрСдСлСния PersistenceProvider ΠΈΠ· JPA (Π² соотвСтствии с Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠΉ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΎΠΉ JPA Π² Java SE) ΠΈ Π² Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π΅ случаСв Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ Π·Π°Π΄Π°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ имя Π΅Π΄ΠΈΠ½ΠΈΡ†Ρ‹ сохраняСмости. Π’ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Π½Π° XML сконфигурирован Ρ‚Π°ΠΊΠΎΠΉ Π±ΠΈΠ½:

<beans>
    <bean id="myEmf" class="org.springframework.orm.jpa.LocalEntityManagerFactoryBean">
        <property name="persistenceUnitName" value="myPersistenceUnit"/>
    </bean>
</beans>

Π­Ρ‚Π° Ρ„ΠΎΡ€ΠΌΠ° развСртывания JPA являСтся самой простой ΠΈ самой ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π½ΠΎΠΉ. Π‘ΡΡ‹Π»Π°Ρ‚ΡŒΡΡ Π½Π° ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π±ΠΈΠ½Π° DataSource ΠΈΠ· JDBC нСльзя, Π° ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹Ρ… Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΉ отсутствуСт. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, связываниС (ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ Π±Π°ΠΉΡ‚-ΠΊΠΎΠ΄Π°) постоянных классов зависит ΠΎΡ‚ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠ³ΠΎ поставщика, ΠΈ часто трСбуСтся Π·Π°Π΄Π°Ρ‚ΡŒ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠ³ΠΎ Π°Π³Π΅Π½Ρ‚Π° JVM ΠΏΡ€ΠΈ запускС. Π­Ρ‚ΠΎΠΉ ΠΎΠΏΡ†ΠΈΠΈ Π±ΡƒΠ΄Π΅Ρ‚ достаточно Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для Π°Π²Ρ‚ΠΎΠ½ΠΎΠΌΠ½Ρ‹Ρ… ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ ΠΈ тСстовых ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠΉ, для ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Π°Π½Π° спСцификация JPA.

ΠŸΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ EntityManagerFactory ΠΈΠ· JNDI

Π­Ρ‚ΠΎΡ‚ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΈ Ρ€Π°Π·Π²Π΅Ρ€Ρ‚Ρ‹Π²Π°Π½ΠΈΠΈ Π½Π° сСрвСрС Java EE. ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΡŽ для вашСго сСрвСра, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ·Π½Π°Ρ‚ΡŒ, ΠΊΠ°ΠΊ Ρ€Π°Π·Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ кастомный поставщик JPA Π½Π° вашСм сСрвСрС, Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ поставщик, ΠΎΡ‚Π»ΠΈΡ‡Π½Ρ‹ΠΉ ΠΎΡ‚ поставщика сСрвСра ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ.

ΠŸΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ EntityManagerFactory ΠΈΠ· JNDI (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π² ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠΈ Java EE) – это вопрос измСнСния ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ XML, ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅:

<beans>
    <jee:jndi-lookup id="myEmf" jndi-name="persistence/myPersistenceUnit"/>
</beans>

Π­Ρ‚ΠΎ дСйствиС ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π΅Ρ‚ ΡΡ‚Π°Π½Π΄Π°Ρ€Ρ‚Π½ΡƒΡŽ Π½Π°Ρ‡Π°Π»ΡŒΠ½ΡƒΡŽ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΡƒ Java EE. Π‘Π΅Ρ€Π²Π΅Ρ€ Java EE автоматичСски ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΠ²Π°Π΅Ρ‚ Π΅Π΄ΠΈΠ½ΠΈΡ†Ρ‹ сохраняСмости (ΠΏΠΎ сути, Ρ„Π°ΠΉΠ»Ρ‹ META-INF/persistence.xml Π² jar-Ρ„Π°ΠΉΠ»Π°Ρ… ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ) ΠΈ записи persistence-unit-ref Π² дСскрипторС развСртывания Java EE (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, web.xml) ΠΈ опрСдСляСт мСстополоТСниС контСкста имСнования окруТСния для этих Π΅Π΄ΠΈΠ½ΠΈΡ† сохраняСмости.

Π’ Ρ‚Π°ΠΊΠΎΠΌ сцСнарии Ρ€Π°Π·Π²Π΅Ρ€Ρ‚Ρ‹Π²Π°Π½ΠΈΠ΅ Π΅Π΄ΠΈΠ½ΠΈΡ† сохраняСмости, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ связываниС (ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ Π±Π°ΠΉΡ‚-ΠΊΠΎΠ΄Π°) классов постоянного хранСния, Ρ†Π΅Π»ΠΈΠΊΠΎΠΌ возлагаСтся Π½Π° сСрвСр Java EE. DataSource ΠΈΠ· JDBC опрСдСляСтся Ρ‡Π΅Ρ€Π΅Π· мСстополоТСниС JNDI Π² Ρ„Π°ΠΉΠ»Π΅ META-INF/persistence.xml. Π’Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ EntityManager ΡΠ²Π»ΡΡŽΡ‚ΡΡ Π½Π΅ΠΎΡ‚ΡŠΠ΅ΠΌΠ»Π΅ΠΌΠΎΠΉ Ρ‡Π°ΡΡ‚ΡŒΡŽ JTA-подсистСмы сСрвСра. Spring просто ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½ΡƒΡŽ EntityManagerFactory, пСрСдавая Π΅Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌ прилоТСния Ρ‡Π΅Ρ€Π΅Π· Π²Π½Π΅Π΄Ρ€Π΅Π½ΠΈΠ΅ зависимостСй ΠΈ управляя транзакциями для Π΅Π΄ΠΈΠ½ΠΈΡ†Ρ‹ сохраняСмости (ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ Ρ‡Π΅Ρ€Π΅Π· JtaTransactionManager).

Если Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ нСсколько Π΅Π΄ΠΈΠ½ΠΈΡ† сохраняСмости, ΠΈΠΌΠ΅Π½Π° Π±ΠΈΠ½ΠΎΠ² Ρ‚Π°ΠΊΠΈΡ… Π΅Π΄ΠΈΠ½ΠΈΡ† сохраняСмости, ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌΡ‹Ρ… ΠΈΠ· JNDI, Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΡΠΎΠ²ΠΏΠ°Π΄Π°Ρ‚ΡŒ с ΠΈΠΌΠ΅Π½Π°ΠΌΠΈ Π΅Π΄ΠΈΠ½ΠΈΡ† сохраняСмости, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ для ссылки Π½Π° Π½ΠΈΡ… (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π² аннотациях @PersistenceUnit ΠΈ @PersistenceContext).

ИспользованиС LocalContainerEntityManagerFactoryBean

Π­Ρ‚ΠΎΡ‚ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для ΠΏΠΎΠ»Π½ΠΎΡ†Π΅Π½Π½ΠΎΠ³ΠΎ использования срСдств JPA Π² ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠΈ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ Π½Π° Π±Π°Π·Π΅ Spring. Π­Ρ‚ΠΎ ΠΏΠΎΠ΄Ρ€Π°Π·ΡƒΠΌΠ΅Π²Π°Π΅Ρ‚ Π²Π΅Π±-ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Ρ‹, Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ Tomcat, Π°Π²Ρ‚ΠΎΠ½ΠΎΠΌΠ½Ρ‹Π΅ прилоТСния ΠΈ ΠΈΠ½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΠΎΠ½Π½Ρ‹Π΅ тСсты со слоТными трСбованиями ΠΊ постоянному Ρ…Ρ€Π°Π½Π΅Π½ΠΈΡŽ.

Если Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎ ΡΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ настройку Hibernate, Ρ‚ΠΎ Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²ΠΎΠΉ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΡ‚Π°Ρ‚ΡŒ настройка собствСнного LocalSessionFactoryBean ΠΈΠ· Hibernate вмСсто ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠ³ΠΎ LocalContainerEntityManagerFactoryBean ΠΈΠ· JPA, Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ Π΅ΠΌΡƒ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ с ΠΊΠΎΠ΄ΠΎΠΌ доступа JPA, Π° Ρ‚Π°ΠΊΠΆΠ΅ с Π½Π°Ρ‚ΠΈΠ²Π½Ρ‹ΠΌ ΠΊΠΎΠ΄ΠΎΠΌ доступа Hibernate. ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎΡΡ‚ΠΈ см. Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ "Нативная настройка Hibernate для взаимодСйствия с JPA".

LocalContainerEntityManagerFactoryBean Π΄Π°Π΅Ρ‚ ΠΏΠΎΠ»Π½Ρ‹ΠΉ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒ Π½Π°Π΄ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠ΅ΠΉ EntityManagerFactory ΠΈ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΈΡ‚ для ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠΉ, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… трСбуСтся тонкая настройка. LocalContainerEntityManagerFactoryBean создаСт экзСмпляр PersistenceUnitInfo Π½Π° основС Ρ„Π°ΠΉΠ»Π° persistence.xml, прСдоставлСнной стратСгии dataSourceLookup ΠΈ Π·Π°Π΄Π°Π½Π½ΠΎΠ³ΠΎ loadTimeWeaver. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ со кастомными источниками Π΄Π°Π½Π½Ρ‹Ρ… Π²Π½Π΅ JNDI ΠΈ ΡƒΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ процСссом привязывания. Π’ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Ρ‚ΠΈΠΏΠΈΡ‡Π½ΠΎΠ΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π±ΠΈΠ½Π° для LocalContainerEntityManagerFactoryBean:

<beans>
    <bean id="myEmf" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
        <property name="dataSource" ref="someDataSource"/>
        <property name="loadTimeWeaver">
            <bean class="org.springframework.instrument.classloading.InstrumentationLoadTimeWeaver"/>
        </property>
    </bean>
</beans>

Π’ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΏΠΎΠΊΠ°Π·Π°Π½ Ρ‚ΠΈΠΏΠΈΡ‡Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» persistence.xml:

<persistence xmlns="http://java.sun.com/xml/ns/persistence" version="1.0">
    <persistence-unit name="myUnit" transaction-type="RESOURCE_LOCAL">
        <mapping-file>META-INF/orm.xml</mapping-file>
        <exclude-unlisted-classes/>
    </persistence-unit>
</persistence>
Π‘ΠΎΠΊΡ€Π°Ρ‰Π΅Π½ΠΈΠ΅ <exclude-unlisted-classes/> ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ сканированиС Π°Π½Π½ΠΎΡ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Ρ… классов сущностСй Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΠΎΡΡƒΡ‰Π΅ΡΡ‚Π²Π»ΡΡ‚ΡŒΡΡ. Π―Π²Π½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ "true" (<exclude-unlisted-classes>true</exclude-unlisted-classes/>) Ρ‚Π°ΠΊΠΆΠ΅ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ отсутствиС ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ. <exclude-unlisted-classes>false</exclude-unlisted-classes/> Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΡƒ. Однако Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡƒΠ΅ΠΌ ΠΎΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ элСмСнт exclude-unlisted-classes, Ссли Π½ΡƒΠΆΠ½ΠΎ ΠΎΡΡƒΡ‰Π΅ΡΡ‚Π²Π»ΡΡ‚ΡŒ сканированиС классов сущностСй.

ИспользованиС LocalContainerEntityManagerFactoryBean являСтся Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ эффСктивным Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΎΠΌ настройки JPA, ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΠ²Π°ΡŽΡ‰ΠΈΠΌ Π³ΠΈΠ±ΠΊΡƒΡŽ Π»ΠΎΠΊΠ°Π»ΡŒΠ½ΡƒΡŽ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡŽ Π² ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ. Он ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ ссылки Π½Π° ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ DataSource ΠΈΠ· JDBC, ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹Π΅ ΠΈ Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹Π΅ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ ΠΈ Ρ‚Π°ΠΊ Π΄Π°Π»Π΅Π΅. Однако ΠΎΠ½ Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΡ€Π΅Π΄ΡŠΡΠ²Π»ΡΠ΅Ρ‚ трСбования ΠΊ ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΡŽ выполнСния, Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ Π½Π°Π»ΠΈΡ‡ΠΈΠ΅ Π·Π°Π³Ρ€ΡƒΠ·Ρ‡ΠΈΠΊΠ° классов с Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒΡŽ привязывания, Ссли поставщику сохраняСмости трСбуСтся ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ Π±Π°ΠΉΡ‚-ΠΊΠΎΠ΄Π°.

Π­Ρ‚ΠΎΡ‚ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚ΠΎΠ²Π°Ρ‚ΡŒ со встроСнными срСдствами JPA сСрвСра Java EE. Π’ ΠΏΠΎΠ»Π½ΠΎΡ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΠΌ ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠΈ Java EE рассмотритС Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ получСния EntityManagerFactory ΠΈΠ· JNDI. Как Π²Π°Ρ€ΠΈΠ°Π½Ρ‚, Π·Π°Π΄Π°ΠΉΡ‚Π΅ кастомноС persistenceXmlLocation Π² ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΈ LocalContainerEntityManagerFactoryBean (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, META-INF/my-persistence.xml) ΠΈ Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ дСскриптор с этим ΠΈΠΌΠ΅Π½Π΅ΠΌ Π² jar-Ρ„Π°ΠΉΠ»Ρ‹ вашСго прилоТСния. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ сСрвСр Java EE ΠΈΡ‰Π΅Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ стандартныС Ρ„Π°ΠΉΠ»Ρ‹ META-INF/persistence.xml, ΠΎΠ½ ΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΡƒΠ΅Ρ‚ Ρ‚Π°ΠΊΠΈΠ΅ кастомныС Π΅Π΄ΠΈΠ½ΠΈΡ†Ρ‹ сохраняСмости, Ρ‡Ρ‚ΠΎ, ΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, позволяСт ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚ΠΎΠ² с настройкой JPA Π½Π° основС Spring. (Π­Ρ‚ΠΎ относится, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΊ Resin 3.1).

Когда Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ привязываниС Π²ΠΎ врСмя Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ?

НС всС поставщики JPA Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‚ наличия Π°Π³Π΅Π½Ρ‚Π° JVM. Hibernate являСтся ΠΊΠ°ΠΊ Ρ€Π°Π· Ρ‚Π°ΠΊΠΈΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠΌ. Если ваш поставщик Π½Π΅ Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ наличия Π°Π³Π΅Π½Ρ‚Π° ΠΈΠ»ΠΈ Ρƒ вас ΠΈΠΌΠ΅ΡŽΡ‚ΡΡ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Ρ‹, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ срСдства, Ρ€Π°ΡΡˆΠΈΡ€ΡΡŽΡ‰ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π», Π²ΠΎ врСмя сборки Ρ‡Π΅Ρ€Π΅Π· кастомный компилятор ΠΈΠ»ΠΈ Π·Π°Π΄Π°Ρ‡Ρƒ Π½Π° основС Ant, Ρ‚ΠΎ Π½Π΅ слСдуСт ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ инструмСнт привязывания ΠΏΠΎ врСмя Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ.

Π˜Π½Ρ‚Π΅Ρ€Ρ„Π΅ΠΉΡ LoadTimeWeaver – это класс, содСрТащийся Π² Spring, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ позволяСт ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒ экзСмпляры ClassTransformer ΠΈΠ· JPA ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Π² зависимости ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ, являСтся Π»ΠΈ ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠ΅ Π²Π΅Π±-ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ΠΎΠΌ ΠΈΠ»ΠΈ сСрвСром ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ. ΠŸΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ClassTransformers Ρ‡Π΅Ρ€Π΅Π· agent ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ нСэффСктивно. АгСнты Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ ΠΏΠΎ всСй Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠΉ машинС ΠΈ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡΡŽΡ‚ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Π·Π°Π³Ρ€ΡƒΠΆΠ°Π΅ΠΌΡ‹ΠΉ класс, Ρ‡Ρ‚ΠΎ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ Π½Π΅ΠΆΠ΅Π»Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ Π² ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠΈ производствСнных сСрвСров.

Spring содСрТит нСсколько Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΉ LoadTimeWeaver для Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠΉ, Ρ‡Ρ‚ΠΎ позволяСт ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ экзСмпляры ClassTransformer Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Π·Π°Π³Ρ€ΡƒΠ·Ρ‡ΠΈΠΊΠ° классов, Π° Π½Π΅ для ΠΊΠ°ΠΆΠ΄ΠΎΠΉ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠΉ ΠΌΠ°ΡˆΠΈΠ½Ρ‹.

Π‘ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΉ LoadTimeWeaver ΠΈ ΠΈΡ… настройкС, ΠΊΠ°ΠΊ Ρ‚ΠΈΠΏΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠΉ, Ρ‚Π°ΠΊ ΠΈ Π°Π΄Π°ΠΏΡ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠΉ ΠΊ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹ΠΌ ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ°ΠΌ (Ρ‚Π°ΠΊΠΈΠΌ ΠΊΠ°ΠΊ Tomcat, JBoss ΠΈ WebSphere), см. Π² Ρ€Π°Π·Π΄Π΅Π»Π΅, посвящСнному ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡŽ Spring Π² Π³Π»Π°Π²Π΅ ΠΏΠΎ АОП.

Как описано Π² Ρ€Π°Π·Π΄Π΅Π»Π΅, посвящСнному ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ Spring, ΡΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ LoadTimeWeaver для всСго контСкста ΠΌΠΎΠΆΠ½ΠΎ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΠΈ @EnableLoadTimeWeaving ΠΈΠ»ΠΈ XML-элСмСнта context:load-time-weaver. Π’Π°ΠΊΠΎΠΉ Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹ΠΉ инструмСнт привязывания автоматичСски подхватываСтся всСми экзСмплярами LocalContainerEntityManagerFactoryBean ΠΈΠ· JPA. Π’ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΏΠΎΠΊΠ°Π·Π°Π½ ΠΏΡ€Π΅Π΄ΠΏΠΎΡ‡Ρ‚ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ способ настройки инструмСнта привязывания Π²ΠΎ врСмя Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ, ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΠ²Π°ΡŽΡ‰ΠΈΠΉ автоматичСскоС ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠ΅Π½ΠΈΠ΅ ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΡ‹ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π·Π°Π³Ρ€ΡƒΠ·Ρ‡ΠΈΠΊ классов Tomcat с ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΎΠΉ привязывания ΠΈΠ»ΠΈ Π°Π³Π΅Π½Ρ‚ JVM ΠΈΠ· Spring) ΠΈ автоматичСскоС распространСниС срСдства привязывания Π½Π° всС Π±ΠΈΠ½Ρ‹, ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‰ΠΈΠ΅ инструмСнт привязывания:

<context:load-time-weaver/>
<bean id="emf" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    ...
</bean>

Однако ΠΏΡ€ΠΈ нСобходимости ΠΌΠΎΠΆΠ½ΠΎ Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ Π·Π°Π΄Π°Ρ‚ΡŒ Π²Ρ‹Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΉ инструмСнт привязывания Ρ‡Π΅Ρ€Π΅Π· свойство loadTimeWeaver, ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅:

<bean id="emf" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    <property name="loadTimeWeaver">
        <bean class="org.springframework.instrument.classloading.ReflectiveLoadTimeWeaver"/>
    </property>
</bean>

НСзависимо ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ настроСно привязываниС Π²ΠΎ врСмя Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ (LTW), с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ этой Ρ‚Π΅Ρ…Π½ΠΈΠΊΠΈ прилоТСния JPA, ΠΏΠΎΠ»Π°Π³Π°ΡŽΡ‰ΠΈΠ΅ΡΡ Π½Π° ΠΈΠ½ΡΡ‚Ρ€ΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΡŽ, ΠΌΠΎΠ³ΡƒΡ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ Π½Π° Ρ†Π΅Π»Π΅Π²ΠΎΠΉ ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ΅ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Tomcat) Π±Π΅Π· нСобходимости использования Π°Π³Π΅Π½Ρ‚Π°. Π­Ρ‚ΠΎ особСнно Π²Π°ΠΆΠ½ΠΎ, Ссли прилоТСния хоста ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ JPA, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Ρ‚Π΅Π»ΠΈ JPA ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡŽΡ‚ΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅ класса-Π·Π°Π³Ρ€ΡƒΠ·Ρ‡ΠΈΠΊΠ° ΠΈ, Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, ΠΈΠ·ΠΎΠ»ΠΈΡ€ΠΎΠ²Π°Π½Ρ‹ Π΄Ρ€ΡƒΠ³ ΠΎΡ‚ Π΄Ρ€ΡƒΠ³Π°.

Π Π°Π±ΠΎΡ‚Π° с нСсколькими Π΅Π΄ΠΈΠ½ΠΈΡ†Π°ΠΌΠΈ сохраняСмости

Для ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ нСсколько мСстополоТСний Π΅Π΄ΠΈΠ½ΠΈΡ† сохраняСмости (хранящихся, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π² Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… JAR-Ρ„Π°ΠΉΠ»Π°Ρ… Π² classpath), Spring ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Π΅Ρ‚ PersistenceUnitManager, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ дСйствуСт ΠΊΠ°ΠΊ Ρ†Π΅Π½Ρ‚Ρ€Π°Π»ΡŒΠ½Ρ‹ΠΉ Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ ΠΈ позволяСт ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ процСсса обнаруТСния Π΅Π΄ΠΈΠ½ΠΈΡ† сохраняСмости, Ρ‡Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π·Π°Ρ‚Ρ€Π°Ρ‚Π½Ρ‹ΠΌ. РСализация ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ позволяСт Π·Π°Π΄Π°Π²Π°Ρ‚ΡŒ нСсколько мСстополоТСний. Π­Ρ‚ΠΈ мСстополоТСния парсится ΠΈ впослСдствии ΠΈΠ·Π²Π»Π΅ΠΊΠ°ΡŽΡ‚ΡΡ Ρ‡Π΅Ρ€Π΅Π· имя Π΅Π΄ΠΈΠ½ΠΈΡ†Ρ‹ сохраняСмости. (По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Π² classpath выполняСтся поиск Ρ„Π°ΠΉΠ»ΠΎΠ² META-INF/persistence.xml). Π’ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ сконфигурировано нСсколько мСстополоТСний:

<bean id="pum" class="org.springframework.orm.jpa.persistenceunit.DefaultPersistenceUnitManager">
    <property name="persistenceXmlLocations">
        <list>
            <value>org/springframework/orm/jpa/domain/persistence-multi.xml</value>
            <value>classpath:/my/package/**/custom-persistence.xml</value>
            <value>classpath*:META-INF/persistence.xml</value>
        </list>
    </property>
    <property name="dataSources">
        <map>
            <entry key="localDataSource" value-ref="local-db"/>
            <entry key="remoteDataSource" value-ref="remote-db"/>
        </map>
    </property>
    <!-- Ссли источник Π΄Π°Π½Π½Ρ‹Ρ… Π½Π΅ ΡƒΠΊΠ°Π·Π°Π½, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ этот  -->
    <property name="defaultDataSource" ref="remoteDataSource"/>
</bean>
<bean id="emf" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    <property name="persistenceUnitManager" ref="pum"/>
    <property name="persistenceUnitName" value="myCustomUnit"/>
</bean>

РСализация ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ позволяСт Π½Π°ΡΡ‚Ρ€Π°ΠΈΠ²Π°Ρ‚ΡŒ экзСмпляры PersistenceUnitInfo (Π΄ΠΎ ΠΈΡ… ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ поставщику JPA) Π»ΠΈΠ±ΠΎ Π΄Π΅ΠΊΠ»Π°Ρ€Π°Ρ‚ΠΈΠ²Π½ΠΎ (Ρ‡Π΅Ρ€Π΅Π· Π΅Π³ΠΎ свойства, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²Π»ΠΈΡΡŽΡ‚ Π½Π° всС Ρ€Π°Π·ΠΌΠ΅Ρ‰Π°Π΅ΠΌΡ‹Π΅ (hosted) Π΅Π΄ΠΈΠ½ΠΈΡ†Ρ‹), Π»ΠΈΠ±ΠΎ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎ (Ρ‡Π΅Ρ€Π΅Π· PersistenceUnitPostProcessor, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ позволяСт ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚ΡŒ Π²Ρ‹Π±ΠΎΡ€ΠΊΡƒ Π΅Π΄ΠΈΠ½ΠΈΡ† сохраняСмости). Если PersistenceUnitManager Π½Π΅ Π·Π°Π΄Π°Π½, Ρ‚ΠΎ ΠΎΠ½ Π±ΡƒΠ΄Π΅Ρ‚ создан ΠΈ использован Π²Π½ΡƒΡ‚Ρ€ΠΈ LocalContainerEntityManagerFactoryBean.

Ѐоновая Π½Π°Ρ‡Π°Π»ΡŒΠ½Π°Ρ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠ°

LocalContainerEntityManagerFactoryBean ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ Ρ„ΠΎΠ½ΠΎΠ²ΠΎΠΉ Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠΉ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ Ρ‡Π΅Ρ€Π΅Π· свойство bootstrapExecutor, ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅:

<bean id="emf" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    <property name="bootstrapExecutor">
        <bean class="org.springframework.core.task.SimpleAsyncTaskExecutor"/>
    </property>
</bean>

ЀактичСская Π½Π°Ρ‡Π°Π»ΡŒΠ½Π°Ρ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠ° поставщика JPA пСрСдаСтся ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠΌΡƒ ΠΈΡΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŽ, Π° Π·Π°Ρ‚Π΅ΠΌ, ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½ΠΎ, ΠΏΠΎΡ‚ΠΎΠΊΡƒ Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠΉ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ прилоТСния. ΠžΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΉ прокси EntityManagerFactory ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π²Π½Π΅Π΄Ρ€Π΅Π½ Π² Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ прилоТСния ΠΈ Π΄Π°ΠΆΠ΅ способСн ΠΎΡ‚Π²Π΅Ρ‡Π°Ρ‚ΡŒ Π½Π° ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΡƒ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ EntityManagerFactoryInfo. Однако, Ссли ΠΊ Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠΌΡƒ поставщику JPA ΠΎΠ±Ρ€Π°Ρ‰Π°ΡŽΡ‚ΡΡ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, вызывая createEntityManager), эти Π²Ρ‹Π·ΠΎΠ²Ρ‹ Π±Π»ΠΎΠΊΠΈΡ€ΡƒΡŽΡ‚ΡΡ Π΄ΠΎ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ Ρ„ΠΎΠ½ΠΎΠ²ΠΎΠΉ Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠΉ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ. Π’ частности, Ссли Π²Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ Spring Data JPA, Π½Π΅ Π·Π°Π±ΡƒΠ΄ΡŒΡ‚Π΅ Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ ΠΎΡ‚Π»ΠΎΠΆΠ΅Π½Π½ΡƒΡŽ Π½Π°Ρ‡Π°Π»ΡŒΠ½ΡƒΡŽ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΡƒ ΠΈ для Π΅Π³ΠΎ Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠ΅Π².

РСализация DAO Π½Π° основС JPA: EntityManagerFactory ΠΈ EntityManager

Π₯отя экзСмпляры EntityManagerFactory ΡΠ²Π»ΡΡŽΡ‚ΡΡ потокобСзопасными, экзСмпляры EntityManager Ρ‚Π°ΠΊΠΎΠ²Ρ‹ΠΌΠΈ Π½Π΅ ΡΠ²Π»ΡΡŽΡ‚ΡΡ. Π’Π½Π΅Π΄Ρ€Π΅Π½Π½Ρ‹ΠΉ EntityManager ΠΈΠ· JPA Π²Π΅Π΄Π΅Ρ‚ сСбя ΠΊΠ°ΠΊ EntityManager, ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹ΠΉ ΠΈΠ· окруТСния JNDI сСрвСра ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ, ΠΊΠ°ΠΊ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΎ спСцификациСй JPA. Он Π΄Π΅Π»Π΅Π³ΠΈΡ€ΡƒΠ΅Ρ‚ всС Π²Ρ‹Π·ΠΎΠ²Ρ‹ Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΌΡƒ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΎΠ½Π½ΠΎΠΌΡƒ EntityManager, Ссли Ρ‚Π°ΠΊΠΎΠ²ΠΎΠΉ имССтся. Π’ ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС ΠΎΠ½ возвращаСтся ΠΊ вновь созданному EntityManager для ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ, фактичСски дСлая Π΅Π³ΠΎ использованиС потокобСзопасным.

МоТно ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΊΠΎΠ΄ Π½Π° ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠΌ JPA Π±Π΅Π· ΠΊΠ°ΠΊΠΈΡ…-Π»ΠΈΠ±ΠΎ зависимостСй Spring, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Π²Π½Π΅Π΄Ρ€Π΅Π½Π½ΡƒΡŽ EntityManagerFactory ΠΈΠ»ΠΈ EntityManager. Spring ΠΌΠΎΠΆΠ΅Ρ‚ Ρ€Π°ΡΠΏΠΎΠ·Π½Π°Π²Π°Ρ‚ΡŒ Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΠΈ @PersistenceUnit ΠΈ @PersistenceContext ΠΊΠ°ΠΊ Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅ поля, Ρ‚Π°ΠΊ ΠΈ Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°, Ссли Π°ΠΊΡ‚ΠΈΠ²ΠΈΡ€ΠΎΠ²Π°Π½ PersistenceAnnotationBeanPostProcessor. Π’ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΏΠΎΠΊΠ°Π·Π°Π½Π° обычная рСализация DAO Π½Π° JPA, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰Π°Ρ Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΡŽ @PersistenceUnit:

Java
public class ProductDaoImpl implements ProductDao {
    private EntityManagerFactory emf;
    @PersistenceUnit
    public void setEntityManagerFactory(EntityManagerFactory emf) {
        this.emf = emf;
    }
    public Collection loadProductsByCategory(String category) {
        EntityManager em = this.emf.createEntityManager();
        try {
            Query query = em.createQuery("from Product as p where p.category = ?1");
            query.setParameter(1, category);
            return query.getResultList();
        }
        finally {
            if (em != null) {
                em.close();
            }
        }
    }
}
Kotlin
class ProductDaoImpl : ProductDao {
    private lateinit var emf: EntityManagerFactory
    @PersistenceUnit
    fun setEntityManagerFactory(emf: EntityManagerFactory) {
        this.emf = emf
    }
    fun loadProductsByCategory(category: String): Collection<*> {
        val em = this.emf.createEntityManager()
        val query = em.createQuery("from Product as p where p.category = ?1");
        query.setParameter(1, category);
        return query.resultList;
    }
}

ΠŸΡ€Π΅Π΄ΡˆΠ΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ DAO Π½Π΅ зависит ΠΎΡ‚ Spring ΠΈ ΠΏΠΎ-ΠΏΡ€Π΅ΠΆΠ½Π΅ΠΌΡƒ Ρ…ΠΎΡ€ΠΎΡˆΠΎ вписываСтся Π² контСкст прилоТСния Spring. Π‘ΠΎΠ»Π΅Π΅ Ρ‚ΠΎΠ³ΠΎ, DAO ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ прСимущСства Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΠΉ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π·Π°ΠΏΡ€Π°ΡˆΠΈΠ²Π°Ρ‚ΡŒ Π²Π½Π΅Π΄Ρ€Π΅Π½ΠΈΠ΅ стандартной EntityManagerFactory, ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ опрСдСлСния Π±ΠΈΠ½Π°:

<beans>
    <!-- постпроцСссор Π±ΠΈΠ½ΠΎΠ² для JPA-Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΠΉ -->
    <bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor"/>
    <bean id="myProductDao" class="product.ProductDaoImpl"/>
</beans>

Π’ качСствС Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Ρ‹ явному ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΡŽ PersistenceAnnotationBeanPostProcessor, рассмотритС Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ использования XML-элСмСнта context:annotation-config ΠΈΠ· Spring Π² ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ контСкста прилоТСния. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, всС стандартныС постпроцСссоры Spring для ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ Π½Π° основС Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΠΉ, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ CommonAnnotationBeanPostProcessor ΠΈ Ρ‚Π°ΠΊ Π΄Π°Π»Π΅Π΅, Π±ΡƒΠ΄ΡƒΡ‚ автоматичСски Ρ€Π΅Π³ΠΈΡΡ‚Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ.

Рассмотрим ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€:

<beans>
    <!-- постпроцСссоры для всСх стандартных Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΠΉ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ -->
    <context:annotation-config/>
    <bean id="myProductDao" class="product.ProductDaoImpl"/>
</beans>

Основная ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° с Ρ‚Π°ΠΊΠΈΠΌ DAO Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ всСгда создаСт Π½ΠΎΠ²Ρ‹ΠΉ EntityManager Ρ‡Π΅Ρ€Π΅Π· Ρ„Π°Π±Ρ€ΠΈΠΊΡƒ. МоТно ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ этого, запросив Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΎΠ½Π½Ρ‹ΠΉ EntityManager (Ρ‚Π°ΠΊΠΆΠ΅ Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΡ‹ΠΉ "ΠΎΠ±Ρ‰ΠΈΠΌ EntityManager", ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΠ½ являСтся ΠΎΠ±Ρ‰ΠΈΠΌ, потокобСзопасным прокси для Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΎΠ½Π½ΠΎΠ³ΠΎ EntityManager), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ Π²Π½Π΅Π΄Ρ€Π΅Π½ вмСсто Ρ„Π°Π±Ρ€ΠΈΠΊΠΈ. Π’ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ, ΠΊΠ°ΠΊ это ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ:

Java
public class ProductDaoImpl implements ProductDao {
    @PersistenceContext
    private EntityManager em;
    public Collection loadProductsByCategory(String category) {
        Query query = em.createQuery("from Product as p where p.category = :category");
        query.setParameter("category", category);
        return query.getResultList();
    }
}
Kotlin
class ProductDaoImpl : ProductDao {
    @PersistenceContext
    private lateinit var em: EntityManager
    fun loadProductsByCategory(category: String): Collection<*> {
        val query = em.createQuery("from Product as p where p.category = :category")
        query.setParameter("category", category)
        return query.resultList
    }
}

Аннотация @PersistenceContext ΠΈΠΌΠ΅Π΅Ρ‚ Π½Π΅ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ type, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΈΠΌΠ΅Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ PersistenceContextType.TRANSACTION. МоТно ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ это Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ для получСния ΠΎΠ±Ρ‰Π΅Π³ΠΎ прокси EntityManager. ΠΠ»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π°, Π° ΠΈΠΌΠ΅Π½Π½ΠΎ PersistenceContextType.EXTENDED, являСтся ΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½Π½ΠΎ Π΄Ρ€ΡƒΠ³ΠΈΠΌ Π΄Π΅Π»ΠΎΠΌ. Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ получаСтся Ρ‚Π°ΠΊ Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΡ‹ΠΉ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½Π½Ρ‹ΠΉ EntityManager, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½Π΅ являСтся потокобСзопасным ΠΈ, ΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, Π½Π΅ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π² ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π΅, ΠΊ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΉ доступом, Ρ‚Π°ΠΊΠΎΠΌΡƒ ΠΊΠ°ΠΊ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, управляСмый Spring Π±ΠΈΠ½-ΠΎΠ΄ΠΈΠ½ΠΎΡ‡ΠΊΠ°. ЭкзСмпляры Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½Π½ΠΎΠ³ΠΎ EntityManager ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½Ρ‹ для использования ΠΈΡΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π² ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°Ρ…, ΡΠΎΡ…Ρ€Π°Π½ΡΡŽΡ‰ΠΈΡ… состояниС, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒΡΡ Π² сСссии, ΠΏΡ€ΠΈ этом ΠΆΠΈΠ·Π½Π΅Π½Π½Ρ‹ΠΉ Ρ†ΠΈΠΊΠ» EntityManager Π½Π΅ привязан ΠΊ Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ, Π° ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ зависит ΠΎΡ‚ прилоТСния.

Π’Π½Π΅Π΄Ρ€Π΅Π½ΠΈΠ΅ зависимостСй Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° ΠΈ поля

МоТно ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΠΈ, ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π°ΡŽΡ‰ΠΈΠ΅ Π²Π½Π΅Π΄Ρ€Π΅Π½ΠΈΠ΅ зависимостСй (Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ @PersistenceUnit ΠΈ @PersistenceContext) для ΠΏΠΎΠ»Π΅ΠΉ ΠΈΠ»ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² Π²Π½ΡƒΡ‚Ρ€ΠΈ класса – ΠΎΡ‚ΡΡŽΠ΄Π° выраТСния "Π²Π½Π΅Π΄Ρ€Π΅Π½ΠΈΠ΅ Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°" ΠΈ "Π²Π½Π΅Π΄Ρ€Π΅Π½ΠΈΠ΅ Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅ поля". Аннотации Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅ ΠΏΠΎΠ»Π΅ΠΉ Π»Π°ΠΊΠΎΠ½ΠΈΡ‡Π½Ρ‹ ΠΈ Π±ΠΎΠ»Π΅Π΅ просты Π² использовании, Π² Ρ‚ΠΎ врСмя ΠΊΠ°ΠΊ Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΠΈ Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ Π²Π½Π΅Π΄Ρ€Π΅Π½Π½ΡƒΡŽ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡ‚ΡŒ. Π’ ΠΎΠ±ΠΎΠΈΡ… случаях Π²ΠΈΠ΄ΠΈΠΌΠΎΡΡ‚ΡŒ Ρ‡Π»Π΅Π½Π° (ΠΏΡƒΠ±Π»ΠΈΡ‡Π½Ρ‹ΠΉ, Π·Π°Ρ‰ΠΈΡ‰Π΅Π½Π½Ρ‹ΠΉ ΠΈΠ»ΠΈ ΠΏΡ€ΠΈΠ²Π°Ρ‚Π½Ρ‹ΠΉ) Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ значСния.

Π§Ρ‚ΠΎ ΠΆΠ΅ насчСт Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΠΉ Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅ классов?

На ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ΅ Java EE ΠΎΠ½ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ для объявлСния зависимостСй, Π° Π½Π΅ для внСдрСния рСсурсов.

ВнСдряСмый EntityManager управляСтся Spring (ΡƒΡ‡ΠΈΡ‚Ρ‹Π²Π°Π΅Ρ‚ Ρ‚Π΅ΠΊΡƒΡ‰ΡƒΡŽ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΡŽ). Π”Π°ΠΆΠ΅ Ссли новая рСализация DAO ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Π²Π½Π΅Π΄Ρ€Π΅Π½ΠΈΠ΅ EntityManager Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² вмСсто EntityManagerFactory, Π½ΠΈΠΊΠ°ΠΊΠΈΡ… ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ Π² XML контСкста прилоТСния Π½Π΅ трСбуСтся благодаря использованию Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΠΉ.

Π“Π»Π°Π²Π½ΠΎΠ΅ прСимущСство этого стиля DAO Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ зависит Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΡ‚ Java Persistence API. Π˜ΠΌΠΏΠΎΡ€Ρ‚ ΠΊΠ°ΠΊΠΎΠ³ΠΎ-Π»ΠΈΠ±ΠΎ класса Spring Π½Π΅ трСбуСтся. Π‘ΠΎΠ»Π΅Π΅ Ρ‚ΠΎΠ³ΠΎ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΠΈ JPA распознаваСмыС, Π²Π½Π΅Π΄Ρ€Π΅Π½ΠΈΠ΅ примСняСтся ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ΠΎΠΌ Spring автоматичСски. Π­Ρ‚ΠΎ ΠΏΡ€ΠΈΠ²Π»Π΅ΠΊΠ°Ρ‚Π΅Π»ΡŒΠ½ΠΎ с Ρ‚ΠΎΡ‡ΠΊΠΈ зрСния нСагрСссивности ΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ Π±ΠΎΠ»Π΅Π΅ СстСствСнным для Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ² JPA.

Π’Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ JPA, управляСмыС Spring

ΠœΡ‹ Π½Π°ΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡƒΠ΅ΠΌ ΠΎΠ·Π½Π°ΠΊΠΎΠΌΠΈΡ‚ΡŒΡΡ с Ρ€Π°Π·Π΄Π΅Π»ΠΎΠΌ "Π”Π΅ΠΊΠ»Π°Ρ€Π°Ρ‚ΠΈΠ²Π½ΠΎΠ΅ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ транзакциями", Ссли Π²Ρ‹ Π΅Ρ‰Π΅ Π½Π΅ сдСлали этого, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Π±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½Ρ‹Π΅ Ρ€Π°Π·ΡŠΡΡΠ½Π΅Π½ΠΈΡ ΠΊΠ°ΡΠ°Ρ‚Π΅Π»ΡŒΠ½ΠΎ Π΄Π΅ΠΊΠ»Π°Ρ€Π°Ρ‚ΠΈΠ²Π½Ρ‹Ρ… Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΉ Π² Spring.

РСкомСндуСмая стратСгия для JPA – Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹Π΅ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ встроСнной ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΈ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΉ JPA. JpaTransactionManager ΠΈΠ· Spring ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Π΅Ρ‚ мноТСство срСдств, извСстных ΠΏΠΎ Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΌ транзакциям ΠΈΠ· JDBC (Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ спСцифичныС для Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΉ ΡƒΡ€ΠΎΠ²Π½ΠΈ изоляции ΠΈ оптимизация Ρ€Π΅ΠΆΠΈΠΌΠ° "Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для чтСния" Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅ рСсурсов), Π² ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠΈ любого ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠ³ΠΎ ΠΏΡƒΠ»Π° соСдинСний JDBC (Π±Π΅Π· Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Π½ΠΈΠΉ XA).

JPA Ρ‡Π΅Ρ€Π΅Π· Spring Ρ‚Π°ΠΊΠΆΠ΅ позволяСт сконфигурированному JpaTransactionManager ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°Ρ‚ΡŒ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΡŽ JPA для ΠΊΠΎΠ΄Π° доступа JDBC, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ обращаСтся ΠΊ Ρ‚ΠΎΠΌΡƒ ΠΆΠ΅ DataSource, ΠΏΡ€ΠΈ условии, Ρ‡Ρ‚ΠΎ зарСгистрированный JpaDialect ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ Connection ΠΈΠ· JDBC. Spring содСрТит Π΄ΠΈΠ°Π»Π΅ΠΊΡ‚Ρ‹ для Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΉ EclipseLink ΠΈ Hibernate Ρ‡Π΅Ρ€Π΅Π· JPA.

Π’ качСствС нСпосрСдствСнной Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Ρ‹, Π½Π°Ρ‚ΠΈΠ²Π½Ρ‹ΠΉ HibernateTransactionManager ΠΈΠ· Spring способСн Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ с ΠΊΠΎΠ΄ΠΎΠΌ доступа JPA, Π°Π΄Π°ΠΏΡ‚ΠΈΡ€ΡƒΡΡΡŒ ΠΊ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ особСнностям Hibernate ΠΈ обСспСчивая взаимодСйствиС с JDBC. Π­Ρ‚ΠΎ ΠΈΠΌΠ΅Π΅Ρ‚ особый смысл Π² сочСтании с настройкой LocalSessionFactoryBean. ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅ см. Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ "Нативная настройка Hibernate для взаимодСйствия с JPA".

ΠžΡΠ½ΠΎΠ²Π½Ρ‹Π΅ свСдСния ΠΎ JpaDialect ΠΈ JpaVendorAdapter

Π’ качСствС Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½Π½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ JpaTransactionManager ΠΈ подклассы AbstractEntityManagerFactoryBean ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Ρ‚ΡŒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ JpaDialect Π² свойство Π±ΠΈΠ½Π° jpaDialect. РСализация JpaDialect ΠΌΠΎΠΆΠ΅Ρ‚ Π²ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½Π½Ρ‹Π΅ возмоТности, ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅ΠΌΡ‹Π΅ Spring, ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ Π² зависимости ΠΎΡ‚ производитСля:

  • ΠŸΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ спСцифичСской сСмантики Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΉ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, кастомного уровня изоляции ΠΈΠ»ΠΈ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ оТидания Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ)

  • ΠŸΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΎΠ½Π½ΠΎΠ³ΠΎ Connection JDBC (Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΡŒ Π΅Π³ΠΎ Π½Π° DAO-ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌ Π½Π° основС JDBC)

  • Π Π°ΡΡˆΠΈΡ€Π΅Π½Π½ΠΎΠ΅ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ PersistenceExceptions Π² DataAccessExceptions ΠΈΠ· Spring

Π­Ρ‚ΠΎ особСнно ΠΏΠΎΠ»Π΅Π·Π½ΠΎ Π² случаС ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠΉ сСмантики Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΉ ΠΈ для Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½Π½ΠΎΠ³ΠΎ прСобразования ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ. РСализация ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ(DefaultJpaDialect) Π½Π΅ прСдоставляСт Π½ΠΈΠΊΠ°ΠΊΠΈΡ… ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Ρ… возмоТностСй, ΠΈ Ссли Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‚ΡΡ пСрСчислСнныС Ρ€Π°Π½Π΅Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π·Π°Π΄Π°Π²Π°Ρ‚ΡŒ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ Π΄ΠΈΠ°Π»Π΅ΠΊΡ‚.

JpaVendorAdapter, являясь Π΅Ρ‰Π΅ Π±ΠΎΠ»Π΅Π΅ ΡˆΠΈΡ€ΠΎΠΊΠΈΠΌ срСдством Π°Π΄Π°ΠΏΡ‚Π°Ρ†ΠΈΠΈ поставщика Π² ΠΏΠ΅Ρ€Π²ΡƒΡŽ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ для ΠΏΠΎΠ»Π½ΠΎΡ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΠΉ настройки LocalContainerEntityManagerFactoryBean ΠΈΠ· Spring, ΠΎΠ±ΡŠΠ΅Π΄ΠΈΠ½ΡΠ΅Ρ‚ возмоТности JpaDialect с Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ спСцифичСскими для поставщика Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π°ΠΌΠΈ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ. Π—Π°Π΄Π°Π½ΠΈΠ΅ HibernateJpaVendorAdapter ΠΈΠ»ΠΈ EclipseLinkJpaVendorAdapter являСтся Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ ΡƒΠ΄ΠΎΠ±Π½Ρ‹ΠΌ способом автоматичСской настройки EntityManagerFactory для Hibernate ΠΈΠ»ΠΈ EclipseLink соотвСтствСнно. ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ эти Π°Π΄Π°ΠΏΡ‚Π΅Ρ€Ρ‹ поставщиков Π² ΠΏΠ΅Ρ€Π²ΡƒΡŽ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½Ρ‹ для использования ΠΏΡ€ΠΈ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠΈ транзакциями Π½Π° основС Spring (Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ для использования с JpaTransactionManager).

Π‘ΠΌ. javadoc ΠΏΠΎ JpaDialect ΠΈ JpaVendorAdapter для получСния Π±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎΠΉ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΎΠ± ΠΈΡ… Ρ€Π°Π±ΠΎΡ‚Π΅ ΠΈ ΠΎ Ρ‚ΠΎΠΌ, ΠΊΠ°ΠΊ ΠΎΠ½ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ Π² Ρ€Π°ΠΌΠΊΠ°Ρ… срСдств ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΈ Spring для JPA.

Настройка JPA с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ управлСния транзакциями Ρ‡Π΅Ρ€Π΅Π· JTA

Как Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π° JpaTransactionManager, Spring Ρ‚Π°ΠΊΠΆΠ΅ позволяСт ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ с нСсколькими рСсурсами Ρ‡Π΅Ρ€Π΅Π· JTA Π»ΠΈΠ±ΠΎ Π² ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠΈ Java EE, Π»ΠΈΠ±ΠΎ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚ΠΎΡ€Π° Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΉ, Ρ‚Π°ΠΊΠΎΠ³ΠΎ ΠΊΠ°ΠΊ Atomikos. Помимо Π²Ρ‹Π±ΠΎΡ€Π° JtaTransactionManager вмСсто JpaTransactionManager, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΡ€Π΅Π΄ΠΏΡ€ΠΈΠ½ΡΡ‚ΡŒ Π΅Ρ‰Π΅ нСсколько шагов:

  • ΠžΡΠ½ΠΎΠ²Π½Ρ‹Π΅ ΠΏΡƒΠ»Ρ‹ соСдинСний JDBC Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ совмСстимы с XA ΠΈ ΠΈΠ½Ρ‚Π΅Π³Ρ€ΠΈΡ€ΠΎΠ²Π°Π½Ρ‹ с вашим ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚ΠΎΡ€ΠΎΠΌ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΉ. ΠžΠ±Ρ‹Ρ‡Π½ΠΎ Π² ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠΈ Java EE это дСлаСтся просто, ΠΏΡƒΡ‚Π΅ΠΌ открытия DataSource Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ° Ρ‡Π΅Ρ€Π΅Π· JNDI. ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎΡΡ‚ΠΈ см. Π² Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ ΠΏΠΎ Π²Π°ΡˆΠ΅ΠΌΡƒ сСрвСру ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ. Аналогичным ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Π°Π²Ρ‚ΠΎΠ½ΠΎΠΌΠ½Ρ‹ΠΉ ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚ΠΎΡ€ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΉ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ поставляСтся со спСциализированными Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π°ΠΌΠΈ DataSource, ΠΈΠ½Ρ‚Π΅Π³Ρ€ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΌΠΈ с XA. ΠžΠΏΡΡ‚ΡŒ ΠΆΠ΅, ΠΎΠ·Π½Π°ΠΊΠΎΠΌΡŒΡ‚Π΅ΡΡŒ с Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠ΅ΠΉ.

  • Настройка EntityManagerFactory ΠΈΠ· JPA Π΄ΠΎΠ»ΠΆΠ½Π° Π±Ρ‹Ρ‚ΡŒ сконфигурирована для JTA. ВсС зависит ΠΎΡ‚ производитСля, Π½ΠΎ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ это дСлаСтся Ρ‡Π΅Ρ€Π΅Π· ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Π΅ свойства, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ Π·Π°Π΄Π°Π½Ρ‹ ΠΊΠ°ΠΊ jpaProperties для LocalContainerEntityManagerFactoryBean. Π’ случаС Hibernate эти свойства Π΄Π°ΠΆΠ΅ зависят ΠΎΡ‚ вСрсии. ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎΡΡ‚ΠΈ см. Π² Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ ΠΏΠΎ Hibernate.

  • HibernateJpaVendorAdapter ΠΈΠ· Spring примСняСт ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Π΅ Spring-ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ значСния ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ, Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ Ρ€Π΅ΠΆΠΈΠΌ освобоТдСния соСдинСния, on-close, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ совпадаСт с собствСнным Π·Π½Π°Ρ‡Π΅Π½ΠΈΡŽ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΈΠ· Hibernate Π² Hibernate 5.0, Π½ΠΎ ΡƒΠΆΠ΅ Π½Π΅ совпадаСт с Π½ΠΈΠΌ Π² Hibernate 5.1+. Для настройки JTA ΡƒΠ±Π΅Π΄ΠΈΡ‚Π΅ΡΡŒ, Ρ‡Ρ‚ΠΎ Ρ‚ΠΈΠΏ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ вашСй Π΅Π΄ΠΈΠ½ΠΈΡ†Ρ‹ сохраняСмости объявлСн ΠΊΠ°ΠΊ "JTA". Как Π²Π°Ρ€ΠΈΠ°Π½Ρ‚, установитС свойство hibernate.connection.handling_modeΠΈΠ· Hibernate 5.2 Π² DELAYED_ACQUISITION_AND_RELEASE_AFTER_STATEMENT, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²ΠΎΡΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ собствСнноС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Hibernate ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ. Π‘ΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ Π·Π°ΠΌΠ΅Ρ‚ΠΊΠΈ см. Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ "Π›ΠΎΠΆΠ½Ρ‹Π΅ прСдупрСТдСния сСрвСра ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ ΠΏΡ€ΠΈ использовании Hibernate".

  • Π’ качСствС Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Ρ‹, рассмотритС Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ получСния EntityManagerFactory с самого сСрвСра ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ (Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ Ρ‡Π΅Ρ€Π΅Π· JNDI-поиск вмСсто локально объявлСнного LocalContainerEntityManagerFactoryBean). ΠŸΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΠ΅ΠΌΠ°Ρ сСрвСром EntityManagerFactory ΠΌΠΎΠΆΠ΅Ρ‚ Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Ρ‚ΡŒ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Ρ… ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΉ Π² ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ вашСго сСрвСра (Ρ‡Ρ‚ΠΎ Π΄Π΅Π»Π°Π΅Ρ‚ Ρ€Π°Π·Π²Π΅Ρ€Ρ‚Ρ‹Π²Π°Π½ΠΈΠ΅ ΠΌΠ΅Π½Π΅Π΅ платформонСзависимым), Π½ΠΎ ΠΎΠ½Π° настроСна для JTA-окруТСния сСрвСра.

Нативная настройка Hibernate ΠΈ Π½Π°Ρ‚ΠΈΠ²Π½Ρ‹Π΅ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ Hibernate для взаимодСйствия с JPA

Нативная настройка LocalSessionFactoryBean Π² сочСтании с HibernateTransactionManager позволяСт Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ с аннотациями @PersistenceContext ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠΌ ΠΊΠΎΠ΄ΠΎΠΌ доступа JPA. SessionFactory ΠΈΠ· Hibernate Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Π½Π°Ρ‚ΠΈΠ²Π½ΠΎ Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅Ρ‚ интСрфСйс EntityManagerFactory ΠΈΠ· JPA, Π° дСскриптор Session ΠΈΠ· Hibernate Π½Π°Ρ‚ΠΈΠ²Π½ΠΎ являСтся EntityManager для JPA. БрСдства ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΈ JPA Π² Spring автоматичСски ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ собствСнныС сСссии Hibernate.

ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ такая нативная настройка Hibernate ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠ»ΡƒΠΆΠΈΡ‚ΡŒ Π·Π°ΠΌΠ΅Π½ΠΎΠΉ стандартной ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΠΈ LocalContainerEntityManagerFactoryBean ΠΈ JpaTransactionManager ΠΈΠ· JPA Π²ΠΎ ΠΌΠ½ΠΎΠ³ΠΈΡ… сцСнариях, позволяя Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ с SessionFactory.getCurrentSession() (Π° Ρ‚Π°ΠΊΠΆΠ΅ HibernateTemplate) наряду с Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΠ΅ΠΉ @PersistenceContext EntityManager Π² Ρ€Π°ΠΌΠΊΠ°Ρ… ΠΎΠ΄Π½ΠΎΠΉ локальной Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ. Вакая настройка Ρ‚Π°ΠΊΠΆΠ΅ обСспСчиваСт Π±ΠΎΠ»Π΅Π΅ Ρ‚Π΅ΡΠ½ΡƒΡŽ ΠΈΠ½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΡŽ с Hibernate ΠΈ Π±ΠΎΠ»ΡŒΡˆΡƒΡŽ Π³ΠΈΠ±ΠΊΠΎΡΡ‚ΡŒ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΠ½Π° Π½Π΅ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π° ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚Π°ΠΌΠΈ Π·Π°Π³Ρ€ΡƒΠ·ΠΎΡ‡Π½ΠΎΠ³ΠΎ шаблона JPA.

Π’ Ρ‚Π°ΠΊΠΎΠΌ случаС конфигурация HibernateJpaVendorAdapter Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ встроСнная Π² Spring настройка Hibernate прСдоставляСт Π΅Ρ‰Π΅ большС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹Ρ… возмоТностСй (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΊΠ°ΡΡ‚ΠΎΠΌΠ½ΡƒΡŽ настройку Hibernate Integrator, ΠΈΠ½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΡŽ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π° Π±ΠΈΠ½ΠΎΠ² Hibernate 5.3 ΠΈ Π±ΠΎΠ»Π΅Π΅ ΡΡ‚Ρ€ΠΎΠ³ΡƒΡŽ оптимизация для Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΉ Π² Ρ€Π΅ΠΆΠΈΠΌΠ΅ "Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для чтСния"). И послСднСС, Π½ΠΎ Π½Π΅ ΠΏΠΎ ваТности: Π²Ρ‹ Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π²Ρ‹Ρ€Π°Π·ΠΈΡ‚ΡŒ Π½Π°Ρ‚ΠΈΠ²Π½ΡƒΡŽ настройку Hibernate Ρ‡Π΅Ρ€Π΅Π· LocalSessionFactoryBuilder, с Π»Π΅Π³ΠΊΠΎΡΡ‚ΡŒΡŽ выполняя ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΡŽ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡŽ Π½Π° основС Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΠΈ @Bean (Π±Π΅Π· использования FactoryBean).

LocalSessionFactoryBean ΠΈ LocalSessionFactoryBuilder ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‚ Ρ„ΠΎΠ½ΠΎΠ²ΡƒΡŽ Π½Π°Ρ‡Π°Π»ΡŒΠ½ΡƒΡŽ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΡƒ, ΠΊΠ°ΠΊ ΠΈ LocalContainerEntityManagerFactoryBean ΠΈΠ· JPA. Π’Π²ΠΎΠ΄Π½ΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ см. Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ "Ѐоновая Π½Π°Ρ‡Π°Π»ΡŒΠ½Π°Ρ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠ°".

Для LocalSessionFactoryBean это доступно Ρ‡Π΅Ρ€Π΅Π· свойство bootstrapExecutor. Π’ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠΌ LocalSessionFactoryBuilder ΠΏΠ΅Ρ€Π΅Π³Ρ€ΡƒΠΆΠ΅Π½Π½Ρ‹ΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ buildSessionFactory ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ исполнитСля Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠΉ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ.