2011-03-21 12 views
15

He estado leyendo la documentación de Spring, pero debo decir que es un poco confuso, dando varias opciones diferentes sobre cómo configurar JPA.¿Cómo se configura JPA con Spring 3?

¿Cuál es la mejor forma y cómo obtener el JPA 2 (con hibernación) configurado con el resorte 3? Si tiene un ejemplo de pom, web.xml, applicationContext.xml y cualquier código de java necesario, podría publicarlo también amablemente.

gracias!

Respuesta

1

Le sugiero que eche un vistazo a Spring Roo, que crea un proyecto web Spring junto con el pom y todos los archivos de configuración necesarios (por ejemplo, JPA). Y si no le gusta Roo, puede soltarlo y amenazar el proyecto como suele ser la aplicación web de Spring. En mi humilde opinión, la forma más rápida de obtener una configuración inicial del proyecto.

+0

El problema es que estoy usando JSF y Spring MVC no ... – Emerson

13

Uso EclipseLink, pero la configuración debe ser muy similar. Aquí tienes las partes más importantes.

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); 
    } 

} 

espero que ayude.

5

Alternativamente, Spring 3+ y JPA 2.0 se pueden integrar con la ayuda de proxies dinámicos.

se puede encontrar toda la documentación y descarga ejemplo here

En este caso las interfaces con las consultas de JPA con nombre se utiliza para ejecutar consultas. Las interfaces se tratan como granos comunes de Spring con la ayuda de proxies dinámicos. Se pueden inyectar (o autoconectar) en cualquier otro grano de la misma manera.

También las consultas pueden ubicarse en archivos orm-mapping.xml separados y dividirse por dominio (o según su conveniencia). Eso le da una alta flexibilidad y capacidad de mantenimiento a la capa persistente.

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> 
+0

yo estaba usando la misma forma de obtener el EntityManager pero parece que de esta manera la creación de la primavera causa muchas sesiones de hibernación que no reciben gratis, que causa una pérdida de memoria. experimentaste algo así? encontró más información [aquí] (http://stackoverflow.com/q/17823599/1211174) – oak

Cuestiones relacionadas