【问题标题】:How to get JPA configured with Spring 3?如何使用 Spring 3 配置 JPA?
【发布时间】:2011-07-19 09:14:46
【问题描述】:

我一直在阅读 Spring 的文档,但我必须说这有点令人困惑,提供了几种不同的 JPA 配置选项。

使用 spring 3 配置 JPA 2(带有休眠)的最佳方法是什么,以及如何?如果您有 pom、web.xml、applicationContext.xml 和任何需要的 java 代码的示例,请您也将其发布。

谢谢!

【问题讨论】:

    标签: java hibernate spring jpa


    【解决方案1】:

    另外,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>
    

    【讨论】:

    • 我使用相同的方式来获取 EntityManager,但似乎这种方式会导致 spring 创建许多无法释放的休眠会话,从而导致内存泄漏。你有过这样的经历吗?找到更多信息here
    【解决方案2】:

    我使用 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" />
    

    用户.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);
        }
    
    }
    

    希望对你有帮助。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 2015-10-21
        • 1970-01-01
        • 2014-09-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-05-10
        • 1970-01-01
        • 2019-03-01
        相关资源
        最近更新 更多