You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring JPA+Hibernate中@OneToMany关联返回空列表的问题解决

问题排查与解决步骤

1. 修复User类中auths字段的初始化问题

你的User类中auths字段未设置默认初始化值,JPA实例化User对象时无法自动创建列表实例,直接导致返回空列表。修改构造函数,为auths添加默认初始化:

@Entity
@Table(name = "users")
class User(
    id: Long = 0,

    @Column(name = "name", nullable = false)
    var name: String,

    @Column(name = "email", nullable = false)
    val email: String,

    created: Instant = Instant.now(),

    updated: Instant = Instant.now(),

    @Enumerated(EnumType.STRING)
    var status: UserStatus = UserStatus.NOT_CONFIRMED,

    @OneToMany(fetch = FetchType.EAGER, mappedBy = "user")
    val auths: MutableList<UserAuth> = mutableListOf() // 添加默认初始化
) : BaseEntity(id, created, updated)

2. 验证Liquibase数据库脚本的正确性

由于禁用了Hibernate的DDL自动生成,必须确保Liquibase脚本中的关联配置完全正确:

  • 确认auths表的user_id字段类型与users表的id字段类型一致(均为BIGINT或对应Long的数据库类型)
  • 确认auths表的user_id外键约束正确指向users.id,无约束遗漏或错误
  • 检查数据库中auths.user_id的实际值是否与users.id存在有效关联(无错误值或空值)

3. 排查UserAuth的继承与字段命名冲突

UserAuth同时继承BaseAuth,且拥有一个同为BaseAuth类型的auth字段,这可能导致Hibernate映射混淆:

  • 若BaseAuth是作为JSON存储的DTO类,UserAuth不应继承它;若它是实体基类,不应同时作为JSON字段类型。请根据业务逻辑调整,避免这种命名与继承的冲突。

4. 启用Hibernate日志排查SQL执行情况

在配置文件中开启Hibernate的SQL日志,查看查询User时是否加载了auths:

logging.level.org.hibernate.SQL=DEBUG
logging.level.org.hibernate.type.descriptor.sql.BasicBinder=TRACE

如果日志中未出现查询auths表的SQL,说明映射存在问题;如果有SQL但返回空,说明数据库中关联数据确实不存在或关联条件不匹配。

5. 确认All-Open插件生效

虽然已配置All-Open插件,仍需验证编译后的类是否为open类:

  • 查看编译后的User、UserAuth类文件,确认类声明带有open关键字
  • 若未生效,检查Gradle配置是否正确引入插件:
plugins {
    kotlin("plugin.allopen") version "你的Kotlin版本"
}

内容的提问来源于stack exchange,提问作者Alexander D

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 23:00:44