持久化 LocalDateTime、ZonedDateTime 以及与 Hibernate 协作
在 Java 8 中引入的日期和时间 API 最终取代了旧的 java.util.Date。日期。它使用起来容易得多,最终提供了表示日期、日期与时间以及仅表示时间信息的单独类。这不仅可以改进您的业务代码,还可以更容易地将它们用作实体属性。至少在你使用的是正确版本的 JPA 和/或 Hibernate 时如此。如果你希望在持久化日期和时间 API 类时使用正确...
使用 Prometheus 监控 Spring Boot 应用
使用 Spring Boot,开发人员可以轻松设置独立的高级应用。然而,为了真正提高性能、可用性和可靠性,集成像 Prometheus 这样的复杂监控工具是关键。本文旨在提供将 Prometheus 与 Spring Boot 应用...
Java 中的 hashCode() 指南
哈希是计算机科学的一个基本概念。在 Java 中,高效的哈希算法支持一些最流行的集合,如 HashMap 和 HashSet。本文中,我们将重点介绍 hashCode() 的工作原理、它在集合中的作用以及如何正确实现它。在某些情况下,对集合进行最简单的操作可能效率低下。为了说明,这会触...
Java 中的 record 关键字
在许多 Java 应用中,在对象之间传递不可变数据是最常见但最平凡的任务之一。在 Java 14 之前,这需要创建一个包含样板字段和方法的类,这些字段和方法容易出现琐碎的错误和混乱的意图。随着 Java 14 的发布,现在我们可以使用 record 来解决这些问题。本文中,我们将研究 record 的基本原理,包括它们的意图、生成方法和自定义技术。...
如何在 CompletableFuture 中实现多个 REST 调用
在创建软件功能时,其中一项日常工作是从不同来源检索数据并将其聚合在响应中。在微服务中,这些源通常是外部 REST API。本文中,我们将使用 Java 的 CompletableFuture 来从多个外部 REST API 并行检索数据...
Spring Data JPA 中的 “Not a Managed Type” 异常
在使用 Spring Data JPA 时,我们可能会在引导过程中遇到 “Not a Managed Type” 异常。一些 bean 可能无法创建,导致应用无法启动。虽然实际的堆栈跟踪可能会有所不同...
FetchType: Hibernate & JPA 的 Lazy/Eager 加载
在定义实体映射时,选择正确的 FetchType 是最重要的决定之一。它指定了 JPA 实现(例如 Hibernate)何时从数据库中获取关联实体。你可以在 EAGER 和 LAZY 加载之间进行选择。第一个选项会立即获取关联,另一个仅在使用它时才获取关联。我在本文中解释了这两个选项。选择正确的 FetchType 时的主要挑战是确保尽可能高效地获取实体,并...
使用 JPA 静态元模型创建类型安全的查询
编写条件查询或创建动态实体图时,需要引用实体类及其属性。最快捷、最简单的方法是将所需的名称作为字符串提供。但这有几个缺点,例如,在编写查询时,必须记住或查找实体属性的所有名称。但是,如果必须重构实体并修改某些属性的名称,那么在项目的后期阶段也会导致更大的问题。在这种情况下,必须使用 IDE 的搜索功能,并尝试查找引用修改后的属性的所有字符串。这是一个乏味且容...