2012-07-11 75 views
0

我有三个类呈现并且它们连接到链的域类结构的特例:事件< - 房间< - 投影仪。 (所有的关系舰是一个一对一)Grails具有belongsTo和默认值的多个域类

实施的样子:

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 

看来,级联超过三类不保存默认值。有没有解决方案?或者我做错了什么?

+0

只是为了排除故障...如果您将'投影机投影机=新投影机()'改为'投影机投影机'并将'房间=新房间()'更改为'房间=新房间(投影机:新的投影仪())'有一些方法可以在域类上进行元编程。这可能是通过直接为域类中的投影机分配值,您将绕过处理级联保存的挂钩。 – proflux 2012-07-11 15:53:17

+1

您的推荐有效。也许我的实现绕过了钩子,但我应该如何实现这一点...我不想让其他开发人员创建投影机时想要创建空间和事件。 – kuceram 2012-07-12 08:01:36

+0

不是100%确定这是否可行,但我会尝试向Room添加构造函数,并在构造函数中放置'this.projector = new Projector()'语句。 – proflux 2012-07-12 12:47:14

回答

0

有一个在http://jira.grails.org/browse/GRAILS-4613?attachmentOrder=desc

您的问题进行公开的JIRA个人而言,我会处理的对象的创建在我的控制器,而不是在域做的。您需要能够调用projector.save(flush:true)。

+0

这不是同一个问题。此外,这个bug在Grails 1.3.5中得到修复(我使用Grails 2. *) – kuceram 2012-07-12 08:48:13