1.概述

Hibernate不需要介绍。 它是Java中最受欢迎的ORM。

同样,Spring Boot是目前最强大,最易于使用的Java框架。

本教程与Hibernate或Spring Boot无关,其中有大量的内容。

我们将研究在将它们一起使用时可能会遇到的一些常见错误以及如何修复它们。

2.依存关系

我们将使用Gradle构建我们的项目。 我建议使用Spring Initializr引导您的项目。

我们将使用:

  • Spring靴2
  • Spring Webflux
  • Spring Data JPA
  • Spring数据转换器
  • 杰克逊注释
  • Jackson数据类型休眠
  • H2数据库
  • Lombok

Spring Data Envers允许我们访问Hibernate Envers管理的实体修订。

Jackson批注将帮助我们避免由JPA关系引起的常见堆栈溢出错误。

Jackson DataType Hibernate模块将帮助您处理Hibernate类型和延迟加载方面。

我们将在一段时间内仔细研究所有这些内容。

buildscript {ext {springBootVersion = '2.0.6.RELEASE'}
...
}dependencies {implementation('org.springframework.boot:spring-boot-starter-data-jpa')implementation('org.springframework.boot:spring-boot-starter-webflux')implementation("org.springframework.data:spring-data-envers")implementation("com.fasterxml.jackson.core:jackson-annotations:2.9.7")implementation("com.fasterxml.jackson.datatype:jackson-datatype-hibernate5:2.9.7")runtimeOnly('com.h2database:h2')compileOnly('org.projectlombok:lombok')
...
}

我们将使用H2来运行我们的项目。

3.实体

在此示例中,我们将使用JPA创建大学和学生。

将公共逻辑和属性存储在超类中总是一个好主意。

我们将为我们的实体创建一个超类并在其中存储通用属性。

让我们看一下我们的BaseEntity类。

@Getter @Setter @NoArgsConstructor @AllArgsConstructor @FieldDefaults(level = AccessLevel.PRIVATE)
@MappedSuperclass
@EntityListeners({AuditingEntityListener.class})
@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "id")
public abstract class BaseEntity {@Id@GeneratedValueLong id;@CreatedDateLocalDateTime createdAt;@LastModifiedDateLocalDateTime updatedAt;
}

您可以注意到的一件事是,我没有在课程上使用Lombok的@Data批注。 @Data批注会自动添加@ToString批注,这可能会导致堆栈溢出错误。 因此,最好手动管理注释。

@MappedSuperclass批注允许实体从基类继承属性。 如果要从基类继承属性,则此批注非常重要。

@EntityListeners({AuditingEntityListener.class})启用审核。 我们使用@CreatedDate@LastModifiedDate来捕获创建或修改实体的时间。 Spring Data JPA将对此进行照顾。

将我们的实体转换为JSON时, @JsonIdentityInfo将避免堆栈溢出错误。
由于我们实体之间的双向关系,需要使用此注释来打破无限循环。

您可能还想查看@JsonBackReference@JsonManagedReference以了解它们是否更符合您的要求。

让我们来看看我们的大学和学生实体。

@Getter @Setter @NoArgsConstructor @AllArgsConstructor @Builder @FieldDefaults(level = AccessLevel.PRIVATE)
@Entity @Audited
public class Student extends BaseEntity{String name;@ManyToOneUniversity university;
}
@Getter @Setter @NoArgsConstructor @AllArgsConstructor @Builder @FieldDefaults(level = AccessLevel.PRIVATE)
@Entity @Audited
public class University extends BaseEntity{String name;String city;@OneToMany(mappedBy = "university")Set<Student> students = new HashSet<>();
}

@Audited将使Hibernate管理该实体上的审核(跟踪更改)。

4.配置

让我们检查运行项目所需的配置。

休眠杰克逊模块

@Bean
public Module hibernateModule(){return new Hibernate5Module();
}

我们正在注册一个新的Jackson模块。
Spring Boot将自动检测它并将其注册到ObjectMapper Bean。

休眠Envers

为了启用Envers审核,我们必须使用RevisionRepository扩展我们的存储库。

让我们看看我们的UniversityRepository

public interface UniversityRepository extends RevisionRepository<University, Long, Long>, JpaRepository<University,Long> {
}

我们必须对StudentRepository同样进行此StudentRepository

public interface StudentRepository extends RevisionRepository<Student, Long, Long>, JpaRepository<Student,Long> {
}

我们还必须使用@EnableJpaRepositories(repositoryFactoryBeanClass = EnversRevisionRepositoryFactoryBean.class)注释我们的主类。

在经历了我们需要的其他注释之后,我们将在一段时间内查看主类。

Spring数据审核

为此,我们必须使用@EnableJpaAuditing注释我们的主类。

让我们看看。

@SpringBootApplication
@EnableJpaAuditing
@EnableJpaRepositories(repositoryFactoryBeanClass = EnversRevisionRepositoryFactoryBean.class)
public class HibernateTipsApplication {public static void main(String[] args) {SpringApplication.run(HibernateTipsApplication.class, args);}
}

5.结论

我试图通过一个简单的示例解释如何使用Spring Boot&Hibernate创建REST应用程序。

这可能会解决您的某些堆栈溢出错误。
否则,您可能要考虑编写自己的数据传输对象(DTO)。

如果您需要对核心Hibernate ORM不支持的数据类型的支持,则可能需要签出该库 。

您可以阅读有关以下内容的更多信息:

  • Spring Data JPA

您可以在Github上找到完整的示例。

翻译自: https://www.javacodegeeks.com/2019/01/spring-boot-hibernate-tips.html

Spring Boot休眠提示相关推荐

  1. spring boot 运行提示:Process finished with exit code 1

    spring boot 运行提示:Process finished with exit code 1 经检查发现是由于在application.properties配置文件中将某些自定义配置项移除了, ...

  2. Idea Spring Boot项目提示 repackage failed: Unable to find main class

    本人项目是一个多模块的Spring Boot项目,模块打包时一直显示没有找到主类,很奇怪,我项目中其它的模块都可以正常打包 报错内容: Failed to execute goal org.sprin ...

  3. IDEA中Spring Boot+MyBaits提示Invalid bound statement (not found)错误

    记录一下,项目集成遇见问题. 解决方法: 1.查看mapper.xml中 namespace填写是否一致 2.查看mybatis.yml,如下两项配置路径是否与无法找到mapper路径一致 # 配置类 ...

  4. 解决使用Spring Boot、Multipartfile实现上传提示无法找到文件的问题

    解决使用Spring Boot.Multipartfile实现上传提示无法找到文件的问题 参考文章: (1)解决使用Spring Boot.Multipartfile实现上传提示无法找到文件的问题 ( ...

  5. spring boot: GlobalDefaultExceptionHandler方法内的友好错误提示,全局异常捕获

    spring boot: GlobalDefaultExceptionHandler方法内的友好错误提示,全局异常捕获 当你的某个控制器内的某个方法报错,基本上回显示出java错误代码,非常不友好,这 ...

  6. Spring Boot配置文件有提示

    目录 属性说明 groups properties hints 原理 注解解释器 需要的注解 注解使用 增加文件 参考 在研究spring boot源码时,会在META-INF目录下发现spring- ...

  7. Idea Spring Boot配置文件.yaml或.properties不能自动提示的有效解决办法

    SpringBoot项目的配置文件.yaml/.yml/.properties文件编写的时候没有自动提示,网上的解决办法五花八门,不一定适合具体个人的IDE环境,下面总结一套能解决绝大部分情况的方案: ...

  8. 解决spring boot1.5以上版本@ConfigurationProperties提示“Spring Boot Configuration Annotation Processor not..

    Springboot1.5以上版本,在使用 @ConfigurationProperties注解的时候会提示"Spring Boot Configuration Annotation Pro ...

  9. idea提示未配置 Spring Boot 配置注解处理器解决方法

    未配置 Spring Boot 配置注解处理器 解决方法: 在pom.xml里添加依赖 <dependency><groupId>org.springframework.boo ...

最新文章

  1. 自学机器学习课程怕踩雷?有人帮你选出了top 5优质课
  2. 2 万字长文深入详解 Kafka,从源码到架构全部讲透
  3. 如果去掉UITableView上的section的headerView和footerView的悬浮效果
  4. 英特尔更新人工智能产品线,新品性能达到竞品6倍
  5. dedecms批量删除文档关键词可以吗
  6. 这可能是史上最全 Redis 高可用解决方案总结
  7. 【 POJ - 2033 】Alphacode (dp,有坑)
  8. 推荐10个非常不错的JavaScript移动开发框架
  9. python登陆linkedin过程分析,及二次验证(一)
  10. vue项目 pc端自适配方案
  11. 第1章 【蓦然回首】开篇引导【少年,奋斗吧】
  12. python死循环_python中死循环
  13. 2023第八届少儿模特明星盛典 小超模矫沐含 担任全球赛代言人
  14. linux的input命令,认识linux input子系统(一)
  15. hbo切尔诺贝利_HBO Max,HBO NOW和HBO Go有什么区别?
  16. 计算机更新后打印机无法使用,Win10升级后惠普打印机无法打印的解决方法
  17. 撑不下去的时候,请看看这19张照片
  18. springboot复制bean_【springboot 无法注入Bean_springboot】 | IT修真院·坑乎...
  19. WebSSH安装和开机自启设置
  20. 终稿:教材管理系统与教学评估系统

热门文章

  1. 【DP】I Will Like Matrix!
  2. codeforces gym-101755 D-Transfer Window 二分图匹配、递归
  3. 一个非常好的依存句法可视化工具
  4. 在MySQL的InnoDB存储引擎中count(*)函数的优化
  5. Oracle入门(十二E)之视图操作
  6. Spring开启方法异步执行
  7. 《走遍中国》珍藏版(四)
  8. JavaScript表单
  9. JS生成x到y的随机数
  10. 2020蓝桥杯省赛---java---B---1(门牌制作)