Spring Boot与Hibernate

2023/05/18

1. 概述

在本教程中,我们将学习如何将Spring Boot与Hibernate结合使用。

我们将构建一个简单的Spring Boot应用程序,并演示将它与Hibernate集成是多么容易。

2. 引导应用程序

我们将使用Spring Initializr来引导我们的Spring Boot应用程序。对于此示例,我们将仅使用所需的配置和依赖项来集成Hibernate,添加Web、JPA和H2依赖项。我们将在下一节中解释这些依赖关系。

现在让我们生成项目并在我们的IDE中打开它。我们可以检查生成的项目结构并确定我们需要的配置文件。

这是项目结构的样子:

3. Maven依赖

如果我们打开pom.xml,我们会看到我们有spring-boot-starter-web和spring-boot-starter-test作为Maven依赖项。顾名思义,这些是Spring Boot中的启动器依赖项。

让我们快速浏览一下引入JPA的依赖项:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>

该依赖项包括JPA API、JPA实现、JDBC和其他必要的库。由于默认的JPA实现是Hibernate,因此该依赖实际上也足以将其引入。

最后,我们将使用H2作为此示例的非常轻量级的数据库:

<dependency>
    <groupId>com.h2database</groupId>
    <artifactId>h2</artifactId>
    <scope>runtime</scope>
</dependency>

我们可以使用H2控制台来检查数据库是否已启动并正在运行,还可以为我们的数据输入提供一个用户友好的GUI。我们将继续并在application.properties中启用它:

spring.h2.console.enabled=true

这就是我们需要配置的所有内容,以便在我们的示例中包含Hibernate和H2。当我们启动Spring Boot应用程序时,我们可以在日志上检查配置是否成功:

HHH000412: Hibernate Core {#Version}

HHH000206: hibernate.properties not found

HCANN000001: Hibernate Commons Annotations {#Version}

HHH000400: Using dialect: org.hibernate.dialect.H2Dialect

我们现在可以访问本地主机http://localhost:8080/h2-console/上的H2控制台。

4. 创建实体

为了检查我们的H2是否正常工作,我们将首先在新models文件夹中创建一个JPA实体:

@Entity
public class Book {

    @Id
    @GeneratedValue
    private Long id;
    private String name;

    // standard constructors

    // standard getters and setters
}

我们现在有了一个基本实体,H2可以从中创建一个表。重新启动应用程序并检查H2控制台,将创建一个名为Book的新表。

要向我们的应用程序添加一些初始数据,我们需要创建一个包含一些insert语句的新SQL文件,并将其放在我们的resources文件夹中。我们可以使用import.sql(Hibernate支持)或data.sql(Spring JDBC支持)文件来加载数据

以下是我们的示例数据:

insert into book values(1, 'The Tartar Steppe');
insert into book values(2, 'Poem Strip');
insert into book values(3, 'Restless Nights: Selected Stories of Dino Buzzati');

同样,我们可以重新启动Spring Boot应用程序并检查H2控制台;数据现在位于Book表中。

5. 创建Repository和Service

我们将继续创建基本组件以测试我们的应用程序。首先,我们将在新的repositories文件夹中添加JPA Repository:

@Repository
public interface BookRepository extends JpaRepository<Book, Long> {
}

我们可以使用Spring框架中的JpaRepository接口,它为基本的CRUD操作提供了默认实现。

接下来,我们将BookService添加到一个新的services文件夹中:

@Service
public class BookService {

    @Autowired
    private BookRepository bookRepository;

    public List<Book> list() {
        return bookRepository.findAll();
    }
}

为了测试我们的应用程序,我们需要检查创建的数据是否可以从服务的list()方法中获取。

我们将编写以下Spring Boot Test:

@RunWith(SpringRunner.class)
@SpringBootTest
public class BookServiceUnitTest {

    @Autowired
    private BookService bookService;

    @Test
    public void whenApplicationStarts_thenHibernateCreatesInitialRecords() {
        List<Book> books = bookService.list();

        Assert.assertEquals(books.size(), 3);
    }
}

通过运行这个测试,我们可以检查Hibernate是否创建了Book数据,然后由我们的服务成功获取了这些数据。就是这样,Hibernate与Spring Boot一起运行。

6. 大写表名

有时,我们可能需要将数据库中的表名以大写字母书写。正如我们已经知道的,Hibernate默认情况下会以小写字母生成表的名称

我们可以尝试显式设置表名:

@Entity(name="BOOK")
public class Book {
    // members, standard getters and setters
}

但是,那是行不通的。我们需要在application.properties中设置这个属性:

spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl

然后我们可以在我们的数据库中检查表是否使用大写字母成功创建。

7. 总结

在本文中,我们发现将Hibernate与Spring Boot集成是多么容易。我们使用H2数据库作为一种非常轻量级的内存解决方案。

我们给出了一个使用所有这些技术的应用程序的完整示例。然后我们给出了一个小提示,说明如何在我们的数据库中将表名设置为大写。

与往常一样,本教程的完整源代码可在GitHub上获得。

Show Disqus Comments

Post Directory

扫码关注公众号:Taketoday
发送 290992
即可立即永久解锁本站全部文章