2011-03-21 44 views
15

我一直在阅读spring的文档,但我必须说它有点混乱,给出了有关如何配置JPA的几个不同选项。如何获得使用Spring 3配置的JPA?

什么是最好的方式,以及如何获得JPA 2(与休眠)配置春天3?如果你有一个pom,web.xml,applicationContext.xml和任何所需的java代码的例子,请你也可以发布它。

谢谢!

回答

1

我建议你看看Spring Roo,它会创建一个Spring Web项目以及所需的所有配置文件(例如JPA)。如果你不喜欢Roo,你可以放弃它,并像平常的Spring Web应用程序一样威胁这个项目。恕我直言,获得最初的项目设置的最快方式。

+0

的问题是,我使用JSF而不是我用同样的方式来获得EntityManager的,但似乎Spring MVC的... – Emerson 2011-03-24 22:03:41

13

我使用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); 
    } 

} 

希望它能帮助。

5

或者,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> 
+0

是这样的原因春天创造了许多的Hibernate Session没有得到自由,这会导致内存泄漏。你有没有经历过这样的事情?发现更多信息[这里](http://stackoverflow.com/q/17823599/1211174) – oak 2014-02-07 11:14:44

相关问题