我一直在阅读spring的文档,但我必须说它有点混乱,给出了有关如何配置JPA的几个不同选项。如何获得使用Spring 3配置的JPA?
什么是最好的方式,以及如何获得JPA 2(与休眠)配置春天3?如果你有一个pom,web.xml,applicationContext.xml和任何所需的java代码的例子,请你也可以发布它。
谢谢!
我一直在阅读spring的文档,但我必须说它有点混乱,给出了有关如何配置JPA的几个不同选项。如何获得使用Spring 3配置的JPA?
什么是最好的方式,以及如何获得JPA 2(与休眠)配置春天3?如果你有一个pom,web.xml,applicationContext.xml和任何所需的java代码的例子,请你也可以发布它。
谢谢!
我建议你看看Spring Roo,它会创建一个Spring Web项目以及所需的所有配置文件(例如JPA)。如果你不喜欢Roo,你可以放弃它,并像平常的Spring Web应用程序一样威胁这个项目。恕我直言,获得最初的项目设置的最快方式。
我使用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);
}
}
希望它能帮助。
或者,Spring 3+和JPA 2.0可以与动态代理的帮助集成。
你可以找到所有的文件和下载例如here
在名为JPA查询这种情况下,接口是用来执行查询。在动态代理的帮助下,接口被视为普通的Spring bean。它们可以用相同的方式注入(或自动装配)到任何其他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>
是这样的原因春天创造了许多的Hibernate Session没有得到自由,这会导致内存泄漏。你有没有经历过这样的事情?发现更多信息[这里](http://stackoverflow.com/q/17823599/1211174) – oak 2014-02-07 11:14:44
的问题是,我使用JSF而不是我用同样的方式来获得EntityManager的,但似乎Spring MVC的... – Emerson 2011-03-24 22:03:41