当前位置: 首页 > 知识库问答 >
问题:

Spring Data/Hibernate:已分离的实体传递到Persister

公沈浪
2023-03-14

我得到了“分离的实体传递到持久”,但我不明白,该对象如何能够处于分离状态。
这里首先是一些上下文。

每个用户和角色有两个JParepository:

@Repository
interface RoleRepository : JpaRepository<UserRole, Long> {
    fun findByName(name: String): UserRole?
}

@Repository
interface BackendUserRepository : JpaRepository<BackendUser, Long> {
    fun findByUserName(name: String): BackendUser?
}

BackendUser实体--除了名称之外--有几个不应与此问题相关的字段,外字段角色来自其基类:

abstract class User(
        @ManyToOne(fetch = FetchType.LAZY, cascade = arrayOf(CascadeType.ALL), optional = false)
        @JoinColumn(referencedColumnName = "name", nullable = false)
        var role: UserRole
) : UserDetails {
    // ...
}

在应用程序启动时,我希望确保此ApplicationRunner中存在管理员用户:

@Component
class InitialDataApplicationRunner : ApplicationRunner {
    @Autowired
    lateinit var roles: RoleRepository
    @Autowired
    lateinit var users: BackendUserRepository

    override fun run(args: ApplicationArguments) {
        // some other stuff

        createAdminUser()
    }

    @Transactional
    private fun createAdminUser() {
        if (users.findByUserName("admin") == null) {
            val adminRole = roles.findByName("admin")!!
            val adminUser = BackendUser("admin", adminRole
                 // some more data here
            )
            users.save(adminUser)
        }
    }
}

应用程序在启动时抛出异常并关闭:

我在这里的理解是,adminrole在从存储库中检索到之后就处于分离状态。

  • 为何超脱?我假设方法上的@Transactional注释将确保所有事情都发生在同一个持久性上下文中,而这种情况不应该发生。
  • 如何防止这种情况发生?有没有一种方法不需要删除层叠选项
  • 关于Spring/JPA和hibernate如何发挥作用,有什么好的信息源吗?到目前为止,我发现的任何东西都不能帮助我详细理解这些概念,以及在阅读hibernate时,资源库似乎隐藏了实体管理和会话概念。

共有1个答案

姚晋
2023-03-14

由于您在私有方法上有@Transactional并且从同一个类调用了一个,因此没有事务,因此没有保存的分离状态(请参见下面的内容)。不确定是否可以在run()或该类上应用@transactional。无论如何,也许您应该使用public@transactional方法创建新的“service”类,然后从您的类中调用这个服务。

 类似资料:
  • 我在stackoverflow上读了很多关于相同异常的文章,但没有找到任何实际帮助我的东西,所以我在这里:

  • 我正在尝试使用Hibernate EntityManager持久化方法将person pojo插入mysql db, 得到这个异常, 还有更多.. My person.java类是, 然后使用pojo的getter setter方法。 是否不可能将公共静态final类型定义的类传递给Hibernate?还是我做错了什么? 提前致谢

  • 另外,我有一个IOC托管bean,它内部有一个事务方法。 有2个实体具有单向Many2One-- AuModule在上没有引用

  • 我在尝试使用Spring Data JPA和Hibernate作为JPA提供程序执行批插入操作时遇到了问题。 我有以下方法在我的服务。这就是抛出异常的地方。 Institute是一个实例变量,并提前获取。 我还将实体设置为级联、持久和合并。 为什么这段代码起作用 而此代码不

  • 我正试图实现与hibernate的许多单向关系。问题是,当我试图向数据库中添加一些值时,我遇到了以下错误: 运行时发生异常。null:InvocationTargetException:未能执行ApplicationRunner:传递给persist:dnd35cg的分离实体。模型DND类;嵌套的异常是org。冬眠PersistentObjectException:传递给persist:dnd35

  • 我有一段很长的JPA+Hibernate代码,它试图在循环中将大量记录插入到DB中。 更奇怪的是,我可以用下面的代码在一次迭代中再现错误。“分离的实体...”第二次刷新时抛出错误。那么这是否意味着第一次同花顺是一个无操作?