# Spring ORM 简介

> 原文： [https://javatutorial.net/introduction-to-spring-orm](https://javatutorial.net/introduction-to-spring-orm)

在本教程中，您将学习什么是 Spring ORM 以及如何使用它。

![java-featured-image](img/e0db051dedc1179e7424b6d998a6a772.jpg)

## 什么是 Spring ORM？

Spring ORM 涵盖了 Hibernate，iBatis 和 JPA 等许多技术。 Spring 提供了集成类，因此，所提到的每种技术都可以按照 Spring 的配置原则来实现。

推荐的集成方式是针对 Hibernate，JPA 和 JDO 制作 DAO。

因为所有内容都是作为一组可重用的 JavaBean 设计的，所以我们可以从 ORM 支持中提取与从库中提取一样多的功能。

## 使用 ORM 的优点

由于我们使用名为“实体”的 java 对象映射到数据库表，因此我们可以使用诸如继承和封装之类的 OOP 概念与环境进行交互。 这是一个巨大的好处，因为我们已经熟悉 OOP 概念，并且不必花时间学习新概念等。

*   更容易的测试
*   常见的数据访问异常
*   一般资源管理
*   整合交易管理

要完全深入了解上述优点，请单击此处以获取文档。

## 实践

首先，我们需要在 Spring 容器中设置`SessionFactory`。 这样做是为了避免将应用程序对象与硬编码的资源查找绑定在一起。 我们在应用程序上下文中将 Hibernate `SessionFactory`定义为 bean。 如果您不熟悉 bean，[可以单击此处](https://javatutorial.net/introduction-to-spring-bean)。

```java
<beans>

  <bean id="myDataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
    <property name="driverClassName" value="org.hsqldb.jdbcDriver"/>
    <property name="url" value="jdbc:hsqldb:hsql://localhost:9001"/>
    <property name="username" value="sa"/>
    <property name="password" value=""/>
  </bean>

  <bean id="mySessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
    <property name="dataSource" ref="myDataSource"/>
    <property name="mappingResources">
      <list>
        <value>product.hbm.xml</value>
      </list>
    </property>
    <property name="hibernateProperties">
      <value>
        hibernate.dialect=org.hibernate.dialect.HSQLDialect
      </value>
    </property>
  </bean>

</beans>
```

以下示例显示了 Spring 容器中的 DAO 定义，该定义引用了上面定义的`SessionFactory`和 DAO 方法实现的示例。

```java
<beans>

  <bean id="myProductDao" class="product.ProductDaoImpl">
    <property name="sessionFactory" ref="mySessionFactory"/>
  </bean>

</beans>
```

```java
public class ProductDaoImpl implements ProductDao {

    private HibernateTemplate hibernateTemplate;

    public void setSessionFactory(SessionFactory sessionFactory) {
        this.hibernateTemplate = new HibernateTemplate(sessionFactory);
    }

    public Collection loadProductsByCategory(String category) throws DataAccessException {
    	return this.hibernateTemplate.find("from test.Product product where product.category=?", category);
    }
}
```

以上代码段摘自[原始文档](https://docs.spring.io/spring/docs/4.2.x/spring-framework-reference/html/orm.html)。

我们在这里所做的是，创建了一个实现`ProductDao`接口的`ProductDaoImpl cla`，并在其中包含`HibernateTemplate`实例变量以及`setSessionFactory()`和`loadProductsByCategory()`方法。

如您所见，在`setSessionFactory()`方法中，我们将`hibernateTemplate`设置为指定的`sessionFactory`。

### 什么是`HibernateTemplate`？

`HibernateTemplate`是一个类，可帮助简化数据访问代码。 此类将`HibernateExceptions`转换为`DataAccessExceptions`，这是未经检查的异常。`HibernateTemplate`用于实现数据访问或业务逻辑服务。

如果您对 ORM API 支持的所有方法感兴趣，则可以查看 [Oracle javadoc](https://static.javadoc.io/org.springframework/spring-orm/5.0.8.RELEASE/index.html?overview-summary.html) 。