Spring Boot休眠提示

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
    @GeneratedValue
    Long id;

    @CreatedDate
    LocalDateTime createdAt;
    @LastModifiedDate
    LocalDateTime 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;
    @ManyToOne
    University 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不支持的数据类型的支持,则可能需要签出该

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

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值