使用 Grails 开发 Google App Engine 应用
2010-06-24 00:00:00 来源:WEB开发网清单 6. UserProfile 的 Domain class
package mulan
import javax.persistence.*;
@Entity
class UserProfile implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
Long id
……
}
按照代码清单 5、6 中定义的 User 和 UserProfile 只能够单独维护,没有办法将二者放在同一个事务中进行更新操作。如果要同一个事务中操作关系双方,就必须将被调用方(UserProfile)的主键类型从 Long 变更为 Key,并在其新增的时候将其主键使用 KeyFactory.Builder 生成,从而将 UserProfile 和 User 分配到同一个实体组中。参见清单 7:
清单 7. 将两个实体分配到一个实体组
UserProfile.withTransaction {
Builder keyBuilder = new Builder(User.class.getSimpleName(),
currentUser.id)
keyBuilder.addChild(UserProfile.class.getSimpleName(),
currentUser.id)
def userprofile=new UserProfile(params)
userprofile.id=keyBuilder.getKey()
currentUser.uprofile=keyBuilder.getKey()
currentUser.save()
userprofile.save()
}
注意上述代码中的 keyBuilder.addChild,这个方法将 UserProfile 的主键跟 User 的主键关联起来。从而使 UserProfile 和 User 处于同一个实体组,但是由于是无主的关系,所以需要显式的对 UserProfile 进行保存。这样创建出来的 UserProfile 在修改 / 删除时,可以跟它相关联的 User 实体在同一个事务中操作,参见如下代码。
更多精彩
赞助商链接