java - starter - ¿Cómo configurar JPA con Spring 3?
spring jpa configuration (3)
Alternativamente, Spring 3+ y JPA 2.0 se pueden integrar con la ayuda de proxies dinámicos.
Puedes encontrar toda la documentación y descargar el ejemplo here
En este caso, las interfaces con consultas JPA nombradas se utilizan para ejecutar consultas. Las interfaces se tratan como frijoles de primavera comunes con la ayuda de proxies dinámicos. Se pueden inyectar (o autorizar) en cualquier otro frijol de la misma manera.
Las consultas también pueden ubicarse en archivos orm-mapping.xml separados y dividirse por dominio (o según su conveniencia). Eso le da una gran 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>
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.
¿Cuál es la mejor manera, y cómo, para obtener JPA 2 (con hibernación) configurado con el muelle 3? Si tiene un ejemplo de pom, web.xml, applicationContext.xml y cualquier código java necesario, puede publicarlo también.
¡Gracias!
Le sugiero que eche un vistazo a Spring Roo, crea un proyecto web de Spring junto con el pom y todos los archivos de configuración necesarios (por ejemplo, JPA). Y si no te gusta Roo, puedes soltarlo y amenazar el proyecto como lo es la aplicación Spring Web habitual. En mi humilde opinión, la forma más rápida de obtener una configuración inicial del proyecto.
Yo 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" />
Usuario.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 eso ayude.