Kotlin - 数据类实体抛出 StackOverflowError

2023-11-24

我尝试将 kotlin (版本 1.2.21)与 spring-boot (1.5.9.RELEASE)结合起来。我在使用带有 @Entity 注释的数据类时遇到了问题。我的有问题的实体如下所示:

@Entity
@Table(name = "APP_USER")
data class AppUser(

    @Column(name = "USERNAME", unique = true)
    private val username: String,

    @Column(name = "PASSWORD")
    private val password: String,

    @Column(name = "IS_ACTIVE")
    val isActive: Boolean,

    @Column(name = "REGISTRATION_DATE_TIME")
    val registrationDateTime: LocalDateTime = SystemTimeManager.getSystemDateTime(),

    @OneToMany(mappedBy = "appUser", cascade = [CascadeType.ALL], fetch = FetchType.EAGER)
    val authorities: MutableSet<UserAuthority> = mutableSetOf()
) : EntityBase(), UserDetails {


   internal fun addRole(authority: UserAuthority) {
      this.authorities.add(authority)
   }

}


@Entity
@Table(name = "USER_AUTHORITY")
data class UserAuthority(
    @ManyToOne
    @JoinColumn(name = "APP_USER_ID", nullable = false)
    val appUser: AppUser,

    @Column(name = "ROLE", length = 50, nullable = false)
    @Enumerated(value = EnumType.STRING)
    private val authority: Authority
) : EntityBase(), GrantedAuthority {

override fun getAuthority(): String {
    return authority.name
    }   
}

如您所见,我们在 AppUser 和 UserAuthority 之间有 @OneToMany 关系。现在我尝试添加一些这样的权威:

authoritiesCollection.forEach { appUser.addRole(UserAuthority(appUser, Authority.valueOf(it))) }

在执行期间,第一个权限始终正确添加到 appUser,但是添加第二个权限会产生带有堆栈跟踪的 StackOverflowError

java.lang.StackOverflowError
at security.usermanagement.AppUser.hashCode(AppUser.kt)
at security.usermanagement.UserAuthority.hashCode(UserAuthority.kt)

如果我将这些类设置为非数据,它就会按预期工作。我可能可以通过覆盖 hashcode 和 equals 方法来解决这个问题,但是我有很多实体,所以我真的不想这样做。


您之间存在循环依赖关系AppUser and UserAuthority。在处理 hashCode 时,需要排除其中一个来打破循环依赖。

您可以通过将导致循环依赖的属性移至数据类主体来修复此问题,这样这些属性将不会在自动生成的字段上使用。在这种情况下,它会移动authorities to the AppUser body:

@Entity
@Table(name = "APP_USER")
data class AppUser(

        @Column(name = "USERNAME", unique = true)
        private val username: String,

        @Column(name = "PASSWORD")
        private val password: String,

        @Column(name = "IS_ACTIVE")
        val isActive: Boolean,

        @Column(name = "REGISTRATION_DATE_TIME")
        val registrationDateTime: LocalDateTime = SystemTimeManager.getSystemDateTime(),

) {
    @OneToMany(mappedBy = "appUser", cascade = [CascadeType.ALL], fetch = FetchType.EAGER)
    val authorities: MutableSet<String> = mutableSetOf()

    internal fun addRole(authority: String) {
        this.authorities.add(authority)
    }

}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Kotlin - 数据类实体抛出 StackOverflowError 的相关文章

随机推荐

  • 伪流式传输 MP4 文件

    我有一些关于伪流 MP4 文件的问题 是否下载了整个文件 例如 如果我将 1 分钟删除为 2 分钟的视频 是否只下载后半部分从而节省带宽 我可以使用 Chrome 开发工具检查这个吗 我该如何创建可用于伪流媒体的 MP4 我已经读到元数据需
  • 如何将我的 WordPress 博客合并到 iOS 应用程序中?

    如何将我的 WordPress 博客合并到 iOS 应用程序中 我有一个漂亮的文字新闻网站 我想创建一个本机 iOS 应用程序 我有 iOS 编码知识 但我只是不知道如何以漂亮的方式展示所有最新的博客 提前致谢 有很多方法可以实现这一目标
  • Boost序列化多个对象

    我正在使用二进制序列化带有 boost 的类 我使用 ios append 来继续将多个对象附加到该文件 如何检索所有存储的对象 这是我的测试类 它尝试多次序列化并检索它们 我已经评论了我没有获得正确数据的故障点 using namespa
  • 如何使用 SQL 复制行并获取新旧 ID 作为结果?

    我有一个表 我需要在其中复制某些行 我可以像这样获取新行的 ID DECLARE IDs TABLE ID int INSERT T name address OUTPUT INSERTED TID INTO ids SELECT name
  • 我可以使用 ASP.NET 设置 HTML/电子邮件模板吗?

    我正在开发一个会发送大量电子邮件的网站 我想设置页眉和页脚文本 甚至可能是模板 以允许用户根据需要轻松编辑这些电子邮件 如果我将 HTML 嵌入到 C 字符串文字中 它会很丑陋 并且必须担心转义 包含页眉和页脚的平面文件可能可行 但感觉有些
  • 如何使用.htaccess在codeigniter中实现动态子域?

    如何实现动态子域codeigniter with htaccess 确保您的网站上启用了子域 当您输入 test yoursite com 时 它应该会将您带到站点的欢迎页面 如果相反 它给出 DNS 查找错误 则意味着您的站点上未启用子域
  • 为什么我在 TensorFlow Keras 中的损失函数和指标之间得到不同的值?

    在使用 TensorFlow 进行 CNN 训练时 我使用Keras losses poisson作为损失函数 现在 我喜欢与损失函数一起计算许多指标 并且我观察到Keras metrics poisson给出不同的结果 尽管两者是相同的函
  • 有没有办法为同一 DAG 中的任务配置不同的“重试”

    我有一个 DAG 里面有很多子任务 在 DAG 的中间 有一个验证任务 根据任务的结果 返回代码 我想采取两条不同的路径 如果成功 将遵循一条路线 一系列任务 如果失败 我们将执行一组不同的任务 当前方法有两个问题 一是如果退出代码为 1
  • 在 Android 中发布 ID facebook 共享对话框始终返回 null

    我使用了测试应用程序 ID 并通过测试用户在 facebook 开发网站上的 dash board 应用程序中创建进行登录 使用 facebook sdk 的登录按钮小部件登录时需要 pulish actions 权限 但结果得到的 pos
  • Linq-to-Entity 左 JOIN

    这是我的查询 from forum in Forums join post in Posts on forum equals post Forum into postGroup from p in postGroup where p Par
  • int 和 char 之间的实际区别

    我必须分析这些代码片段的输出 int x y x 200 y 100 x x y y x y x x y printf d d n x y char x y x 200 y 100 x x y y x y x x y printf d d
  • 使用 SpanSizeLookup 设置 GridLayoutManager 中项目的跨度

    我想使用节标题实现类似网格的布局 考虑到https github com TonicArtos StickyGridHeaders 我现在应该做什么 mRecyclerView RecyclerView view findViewById
  • Mac OS X (Darwin) 下的 AF_PACKET 等效项

    我正在尝试在 Mac OS X 上编译一个使用 AF PACKET 套接字和 libpcap 的 C 程序 OS X 中的等效项是什么 Mac OS X 以及其他 BSD 风格的操作系统 例如 FreeBSD NetBSD OpenBSD
  • NSNumberFormatter:大量显示“k”而不是“,000”?

    如果可能的话 我想将我的大数字从 100 000 美元更改为 10 万美元 这是我到目前为止所拥有的 let valueFormatter NSNumberFormatter valueFormatter locale NSLocale c
  • 为什么 Java if 语句以分号结尾时会失败 [重复]

    这个问题在这里已经有答案了 我在开发应用程序时犯了一个编码错误 这是对空引用的测试 我花了几个小时才发现问题所在 但我不明白的是为什么代码会这样 String name null String value null if name null
  • Scikit-learn:如何水平标准化行值?

    我想水平地而不是垂直地标准化下面的值 该代码读取代码后提供的 csv 文件 并输出具有标准化值的新 csv 文件 如何使其水平标准化 给出的代码如下 Code norm code py normalization x min max min
  • 如何更改谷歌地图默认当前位置标记颜色

    我想更改默认电流位置标记颜色 from 蓝色到其他 任何人都可以帮助我如何做到这一点 以下是我要更改的图标颜色 EDIT 您无法更改默认值 您必须拥有并隐藏默认值 您可以通过将自己的标记添加到地图来使用它们 MarkerOptions ma
  • 连接 Oracle 中 SQL 查询的结果

    我的表中有这样的数据 NAME PRICE A 2 B 3 C 5 D 9 E 5 我想在一行中显示所有值 例如 A 2 B 3 C 5 D 9 E 5 我该如何进行查询才能在 Oracle 中得到这样的字符串 我不需要将它编程成某种东西
  • 数据表标题未对齐

    下图显示了单击文本框 搜索 过滤 之前数据表未对齐的标题 一旦后者成为焦点 标题就会再次对齐 我注意到当scrollY关闭时标题很好 我需要它 知道如何解决它 在下面的代码片段中 只需更改分页选项 您就可以再次看到标题的重新对齐 RegSr
  • Kotlin - 数据类实体抛出 StackOverflowError

    我尝试将 kotlin 版本 1 2 21 与 spring boot 1 5 9 RELEASE 结合起来 我在使用带有 Entity 注释的数据类时遇到了问题 我的有问题的实体如下所示 Entity Table name APP USE