SORM:尝试引用一个未持久化的实体

Posted

技术标签:

【中文标题】SORM:尝试引用一个未持久化的实体【英文标题】:SORM: Attempt to refer to an unpersisted entity 【发布时间】:2013-11-29 12:03:47 【问题描述】:

我将 playframework 2.2.1scala 2.10SORM 0.3.10 一起用于 mysql db。 当我试图保存简单案例类的实例时:

case class User(email: String, password: String, token: String, verified: Boolean = false, atoken: UserAuthToken) 
    def save = Db.save[User](this)

我遇到了这个错误:

sorm.core.SormException: Attempt to refer to an unpersisted entity: UserAuthToken(7779235c1fd045f39ced7674a45baaa2,1387039847)

我做错了什么? UserAuthToken 也很简单:

case class UserAuthToken(token: String = UUID.randomUUID().toString.replace("-",""), expire: Int = (Calendar.getInstance().getTimeInMillis/1000).toInt + 60*60*365)

这两个类都注册为 Db 对象中的实体。

【问题讨论】:

【参考方案1】:

UserAuthToken 是一个实体,这意味着它映射到数据库中的某个行。为了让您和 SORM 都能够识别该行(和实体),Db.save(..) 方法返回一个 UserAuthToken with Persisted 类型的值,即带有识别信息的原始值的副本。

User也是一个实体,但它引用UserAuthToken,这意味着它映射到的行必须存储UserAuthToken上的标识信息。因此,为了能够持久化User 类型的值,它必须仅引用已持久化的UserAuthToken。即:

..
val persistedUserAuthToken = Db.save(userAuthToken)
val persistedUser = Db.save( User(.., atoken = persistedUserAuthToken) )

【讨论】:

感谢您的帮助!我考虑过 dat,但没有将持久化令牌作为参数传递,似乎是一个错误:)

以上是关于SORM:尝试引用一个未持久化的实体的主要内容,如果未能解决你的问题,请参考以下文章

使用 SORM 持久化递归数据模型

如何从 SORM 表定义中排除类字段?

如果使用 sorm,如何处理架构更改

非空属性为持久值引用空值或瞬态值

由于先前尝试(但未持久)错误插入,休眠选择(JpaRepository 动态查找)失败

尝试使用 Hibernate 持久化实体时出错(MappingException:未知实体)