首页 > 解决方案 > 即使我使用 LazyLoad,OneToMany 也总是被获取

问题描述

我有一个简单的问题,我不确定为什么这不起作用,我希望有人向我解释什么以及为什么我在对用户进行查询时总是获取角色。

基本上我创建了 User 类并添加了 LazyLoaded 角色列表,但是当我执行查询时,我总是得到角色,这是我不想做的事情。有人可以解释一下为什么会这样吗?

基本上我想要实现的是在我想要的时候获得角色,我的理解是,当我在查询中使用带有 LazyLoad 的 LEFT JOIN FETCH 时,应该获取所有角色......

Bellow 我添加了所有获取角色列表的类和查询,即使我没有在查询中使用 LEFT JOIN FETCH..

我有一个简单的 User 类,如下所示:

@Entity
@Table(name = "users")
data class User (
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        var id: Long?,

        var sponsorId: Long,

        var firstName: String,

        var lastName: String,

        var photo: String,

        @Column(nullable = false, unique = true)
        var username: String,

        @JsonIgnore
        var password: String,

        @JsonIgnore
        var enabled: Boolean
) {
        @OneToMany(mappedBy = "userId", fetch = FetchType.LAZY)
        var roles: Set<UserRole> = emptySet()
}

我还有第二个简单的课程:

@Entity
@Table(name = "user_role")
data class UserRole (
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        var id: Long?,

        @JsonIgnore
        var userId: Long?,

        @Enumerated(EnumType.STRING)
        var role: Role
)

在我的存储库中,我有这个查询,如您所见,我没有 JOIN FETCHED 角色,但无论如何我得到了用户列表和角色列表......

@Repository
interface UserRepository : JpaRepository<User, Long> {
    @Query("SELECT u FROM User u WHERE u.sponsorId = :sponsorId")
    fun findAllBySponsorId(@Param("sponsorId") sponsorId: Long): Set<User>

}

标签: hibernatespring-bootjpaspring-data-jpaspring-data

解决方案


杰克逊可能是这里的罪魁祸首,对我来说也是如此。

您需要让 Jackson 知道您正在使用 Hibernate。

将此添加到您的 pom 中,以便它可以正确处理延迟加载:

<dependency>
  <groupId>com.fasterxml.jackson.datatype</groupId>
  <artifactId>jackson-datatype-hibernate5</artifactId>
</dependency>

并为其创建一个 Bean,例如将其添加到您的应用程序类中:

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

推荐阅读