我得到了“分离的实体传递到持久”,但我不明白,该对象如何能够处于分离状态。
这里首先是一些上下文。
每个用户和角色有两个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并且从同一个类调用了一个,因此没有事务,因此没有保存的分离状态(请参见下面的内容)。不确定是否可以在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中。 更奇怪的是,我可以用下面的代码在一次迭代中再现错误。“分离的实体...”第二次刷新时抛出错误。那么这是否意味着第一次同花顺是一个无操作?