【问题标题】:Grails Multiple domain classes with belongsTo and default valueGrails具有belongsTo和默认值的多个域类
【发布时间】:2012-07-11 14:32:59
【问题描述】:

我有域类结构的特殊情况,其中三个类存在并且它们连接到链:事件

实现如下:

class Event {
    Room room
    static constraints = {
        room(nullable:false)
    }
}
class Room {
    Projector projector = new Projector()
    static belongsTo = [event: Event]
    static constraints = {
        projector(nullable:false)
    }
}
class Projector {
    String something = "Something"
    static belongsTo = [room: Room]
    static constraints = {
        room(nullable:false)
    }
}

当我想用新房间创建事件时,我希望默认情况下会创建投影仪:

class TestController {
    def index() {
        Room room = new Room()
        Event event = new Event(room: room)
        event.save(flush: true, failOnError: true)
        render event
    }
}

我收到以下异常

| Error 2012-07-11 16:09:12,541 [http-bio-8080-exec-3] ERROR errors.GrailsExceptionResolver  - TransientObjectException occurred when processing request: [GET] /Test/room/index
object references an unsaved transient instance - save the transient instance before flushing: Projector. Stacktrace follows:
Message: object references an unsaved transient instance - save the transient instance before flushing: Projector
    Line | Method
->>   46 | onApplicationEvent in org.grails.datastore.mapping.engine.event.AbstractPersistenceEventListener
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
|     18 | index              in RoomController
|   1110 | runWorker . . . .  in java.util.concurrent.ThreadPoolExecutor
|    603 | run                in java.util.concurrent.ThreadPoolExecutor$Worker
^    722 | run . . . . . . .  in java.lang.Thread

似乎级联三个类并不能保存默认值。有什么解决办法吗?还是我做错了什么?

【问题讨论】:

  • 只是为了解决...可能是通过在域类中直接为 Projector 分配一个值,您绕过了处理级联保存的钩子。
  • 您的推荐有效。也许我的实现绕过了这些钩子,但我应该如何实现这个......我不想在其他开发人员想要创建房间和事件时创建 Projector 来惹恼他们。
  • 不是 100% 确定这是否可行,但我会尝试将构造函数添加到 Room 并将语句 this.projector = new Projector() 放入构造函数中。
  • 它也不起作用。这似乎是一个 grails 错误。我提出了一个问题:jira.grails.org/browse/GRAILS-9262

标签: grails grails-orm grails-domain-class grails-2.0


【解决方案1】:

http://jira.grails.org/browse/GRAILS-4613?attachmentOrder=desc 有一个针对您的问题的开放 jira

我个人会在我的控制器中处理对象的创建,而不是在域中进行。你需要能够调用projector.save(flush:true)。

【讨论】:

  • 这不是同一个问题。此外,此错误已在 Grails 1.3.5 中修复(我使用的是 Grails 2.*)
猜你喜欢
  • 2012-05-14
  • 2014-07-17
  • 1970-01-01
  • 1970-01-01
  • 2012-10-10
  • 2016-02-29
  • 2012-11-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多