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