Как настроить JPA с помощью Spring 3? - PullRequest
16 голосов
/ 21 марта 2011

Я читал документацию Spring, но должен сказать, что это немного сбивает с толку, предлагая несколько различных вариантов настройки JPA.

Каков наилучший способ и как получить JPA 2 (в спящем режиме) с пружиной 3? Если у вас есть пример pom, web.xml, applicationContext.xml и любого необходимого Java-кода, не могли бы вы опубликовать его.

спасибо!

Ответы [ 3 ]

13 голосов
/ 21 марта 2011

Я использую EclipseLink, но конфигурация должна быть очень похожей.Здесь у вас есть самые важные части.

pom.xml:

    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-orm</artifactId>
        <version>${org.springframework-version}</version>
    </dependency>
    <dependency>
        <groupId>org.eclipse.persistence</groupId>
        <artifactId>eclipselink</artifactId>
        <version>2.0.1</version> 
    </dependency>
    <dependency> 
        <groupId>javax.persistence</groupId>
        <artifactId>javax.persistence</artifactId>
        <version>2.0.0</version>
    </dependency>

persistence.xml:

    <?xml version="1.0" encoding="UTF-8" ?>
    <persistence xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/persistence 
    http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"
    version="2.0" xmlns="http://java.sun.com/xml/ns/persistence">

    <persistence-unit name="persistenceUnit" transaction-type="RESOURCE_LOCAL" />

</persistence>

applicationContext-dao.xml:

<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    <property name="persistenceXmlLocation" value="classpath:persistence.xml" />
    <property name="persistenceUnitName" value="persistenceUnit" /> 
    <property name="dataSource" ref="dataSource"/>
    <property name="jpaPropertyMap">
        <props>
            <prop key="eclipselink.weaving">false</prop>
        </props>
    </property>
</bean>

<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
    <property name="entityManagerFactory" ref="entityManagerFactory"/>
</bean>
<tx:annotation-driven transaction-manager="transactionManager" />

User.java:

@Entity
public class User {

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE)
    private Integer id;

    private String name;

    // Getters and setters

}

UserDao.java:

@Repository
public class JpaUserDao implements UserDao {

    @PersistenceContext
    private EntityManager em;

    @Override
    public Item get(Integer id) {
        return em.find(User.class, id);
    }
}

UserService.java:

@Service 
public class UserServiceImpl implements UserService {

    @Autowired
    private UserDao userDao;

    @Transactional
    @Override
    public User getUser(Integer id) {
        return userDao.get(id);
    }

}

Надеюсь, это поможет.

6 голосов
/ 21 января 2013

В качестве альтернативы Spring 3+ и JPA 2.0 могут быть интегрированы с помощью динамических прокси.

Вы можете найти всю документацию и скачать пример здесь

В этомcase интерфейсы с именованными запросами JPA используются для выполнения запросов.Интерфейсы обрабатываются как обычные компоненты Spring с помощью динамических прокси.Они могут быть внедрены (или автоматически подключены) в любые другие bean-компоненты таким же образом.

Также запросы могут быть расположены в отдельных файлах orm-mapping.xml и разделены по доменам (или для вашего удобства).Это дает высокую гибкость и ремонтопригодность постоянному слою.

public interface OrganisationQueries {

        @Query(named = "find.organisation.by.role.id")
        public Organisation findOrganisationByRoleId(Long roleId);

        @Query(named = "find.all.organisations")
        public List<Organisation> findAllOrganisations();
    }
    public class OrganisationServiceImpl implements OrganisationService {
        @PersistenceContext
        private EntityManager em;
        @Autowired
        private OrganisationQueries organisationQueries;
        @Override
        public Organisation findOrganisationByRoleId(Long roleId) {
            return organisationQueries.findOrganisationByRoleId(roleId);
        }
        @Override
        public List<Organisation> findAllOrganisations() {
            return organisationQueries.findAllOrganisations();
        }
    }

   <entity-mappings xmlns="..." version="1.0">
      <named-query name="find.organisation.by.role.id">
          <query><![CDATA[
                    select r.organisation from Role r
                    where r.id =?1
          ]]></query>
      </named-query>
      <named-query name="find.all.organisations">
           <query><![CDATA[
                   select org from Organisation org
                    left join fetch org.organisationType
           ]]></query>
       </named-query>
   </entity-mappings>
1 голос
/ 21 марта 2011

Я бы посоветовал вам взглянуть на Spring Roo, он создает веб-проект Spring вместе с pom и всеми необходимыми файлами конфигурации (например, JPA). А если вам не нравится Roo, вы можете отбросить его и поставить под угрозу проект как обычное веб-приложение Spring. ИМХО самый быстрый способ получить начальную настройку проекта.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...