grails - grails gorm如何使用3表层次结构进行联接

标签 grails gorm

我的网络界面有一个ajax调用来更新照片的标题。帖子会将照片的标题和publicId发送给服务。

The service has 

Photo photo = Photo.findByPublicId(params.publicId)
photo.caption = params.caption
photo.save()

但是,我在伯特·贝克威斯(Burt Beckwith)的grails书中已经读过,这并不安全。黑客可以按原样发布任何publicId到我的服务并更新
不属于其 session 的照片的标题。我需要一些有关如何编写更新查询以仅更新属于照片的GORM建议
到当前用户的 session 。由于涉及的连接数量众多,我迷路了。我熟悉获取个人资料/用户:
    User user = User.load(springSecurityService.principal.id)

    Profile profile = Profile.findByUser(user, [lock:true])

但不是一个将整个更新都加入所有查询的查询,而不是Profile.findByUser(user,[lock:true])。photoAlbum.getPhotoWherePublicId(publicId)或看起来会进行4个不同的sql调用的查询。

我所讨论的层次结构的域架构是:
//user from springsecurity for session/login management
class User {
   //no reference to profile
}

class Profile {
   PhotoAlbum photoAlbum
   User user //reference to user

   static constraints = {
       photoAlbum(nullable:true)
   }
}

class PhotoAlbum {
   static hasMany = [photos:Photo]
   static belongsTo = [profile:Profile]
}

class Photo {
   static belongsTo = PhotoAlbum
   String caption
   String publicId
}

最佳答案

也许使用条件或namedQuerie可以做到这一点。
这样的事情可能会起作用:

首先对您的照相课进行一些小的更改

class Photo {
   PhotoAlbum photoAlbum
   static belongsTo = [photoAlbum: PhotoAlbum]
   String caption
   String publicId
}

并尝试使用此标准
Photo.withCriteria{
  eq 'id',params.publicId
  photoAlbum {
    eq 'profile',profile
  } 
}

关于grails - grails gorm如何使用3表层次结构进行联接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19697006/

相关文章:

Grails 2.1.1 - 将默认注入(inject)的日志对象从 commons.logging.Log 更改为 slf4j.Logger

ajax - Grails和pdf.js并通过ajax调用呈现pdf

grails - 为什么Grails似乎正在保存无效的域对象?

grails - 如何设置基于hasMany关系的唯一类属性?

grails - Grails域设计:继承还是具有可空属性的一类?

hibernate - 如何在grails createCriteria()中编写条件

grails - 使用指定的用户名登录int时获得 'Sorry, we were not able to find a user with that username and password.'消息

grails - 我什么时候需要在 Grails 中使用多个编解码器进行编码?

grails - 如何使用RestFul API在Grails中直接调用GSP

grails - 删除Grails服务中的记录