Hibernate不需要多介绍,它是Java中最受欢迎的ORM。同样,Spring Boot是功能最强大且易于使用的框架。本文并不是描述一些关于Hibernate或Spring Boot的用法,因为有很多。相反,我们将研究同时使用它们时可能遇到的一些常见错误以及如何解决。
依赖
我们使用Gradle来构建我们的项目,建议使用 Spring Initializr来引导你的项目。包括如下:
Spring Boot 2Spring WebfluxSpring Data JPASpring Data EnversJackson 注解Jackson DataType HibernateH2 数据库Lombok
Spring Data Envers允许我们访问由Hibernate Envers管理的实体;Jackson Annotations将帮助我们避免由JPA关系引起的常见Stack Overflow错误;Jackson DataType Hibernate 模块将有助于Hibernate类型和延迟加载方面。
实体
在这个例子中,我们将使用JPA来创建universities和students,通用逻辑和属性存储在超类中。即为实体创建一个超类,并在其中存储公共属性,我们来看看这个 BaseEntity 类。
你可以注意到我没有在类上使用@Data注解,@Data注解会自动添加@ToString注解,这可能会导致Stack Overflow错误。因此,最好是手动管理注解。@MappedSuperclass注解允许实体从基类继承属性,即如果要从基类继承属性,这个注解非常重要。
@EntityListeners({AuditingEntityListener.class})启用审计,我们使用@CreatedDate和@LastModifiedDate捕获创建或修改实体的时间,这将由Spring Data JPA处理。@JsonIdentityInfo将我们的实体转换为JSON时,避免Stack Overflow错误。由于我们的实体之间的双向关系,这个注解是打破死循环所必需的。我们来看看我们的University 和Student 实体。
@Audited将使Hibernate能够管理该实体上的审计(跟踪更改)。
配置
我们来检查一下运行项目所需的配置。
Hibernate Jackson 模块
我们注册一个新的Jackson模块,Spring Boot会自动检测它并将其注册到ObjectMapper bean。
Hibernate Envers
要启用Envers,我们必须通过RevisionRepository扩展我们的存储库。UniversityRepository如下所示:
我们需要为StudentRepository 做同样的事情:
我们还需要在我们的主类上使用注解即@EnableJpaRepositories(repositoryFactoryBeanClass = EnversRevisionRepositoryFactoryBean.class)。
Spring Data Auditing
要启用这个功能,也是需要在主类上使用注解 @EnableJpaAuditing。
总结
本文尝试用一个简单的例子解释如何使用Spring Boot和Hibernate创建REST应用程序,可能会帮助您解决一些Stack Overflow错误。否则的话,您可能需要考虑编写自己的数据传输对象(DTO)。如果需要支持核心Hibernate ORM不支持的数据类型,还需要去查看这个库。