hibernate - 即使我使用 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>
}
解决方案
杰克逊可能是这里的罪魁祸首,对我来说也是如此。
您需要让 Jackson 知道您正在使用 Hibernate。
将此添加到您的 pom 中,以便它可以正确处理延迟加载:
<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-hibernate5</artifactId>
</dependency>
并为其创建一个 Bean,例如将其添加到您的应用程序类中:
@Bean
public Module hibernate5Module() {
return new Hibernate5Module();
}
推荐阅读
- css - 如何使用 CSS 在本机脚本中移动标签?
- javascript - 如何匹配两个相邻字符并替换它们,而不必匹配所有排列?
- mysql - 我想在另一个表列中显示两列的结果是“活动”我如何在我的 sql 中执行这个查询
- splunk - splunk:查看其他用户创建的警报
- c# - 未经授权:由于凭据无效,访问被拒绝。用于共享点的 Microsoft Graph API
- reactjs - React 应用中的身份验证和授权
- android - 固定在布局底部的浮动操作按钮
- autodesk-forge - 为多边形设置剖切面
- c# - .Net Core 项目尝试有条件地引用 32/64 位程序集,但 dotnet 构建始终解析 64 位
- python - 用于地理搜索的 pymongo.cursor 输出缓慢