我有三个类呈现并且它们连接到链的域类结构的特例:事件< - 房间< - 投影仪。 (所有的关系舰是一个一对一)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
看来,级联超过三类不保存默认值。有没有解决方案?或者我做错了什么?
只是为了排除故障...如果您将'投影机投影机=新投影机()'改为'投影机投影机'并将'房间=新房间()'更改为'房间=新房间(投影机:新的投影仪())'有一些方法可以在域类上进行元编程。这可能是通过直接为域类中的投影机分配值,您将绕过处理级联保存的挂钩。 – proflux 2012-07-11 15:53:17
您的推荐有效。也许我的实现绕过了钩子,但我应该如何实现这一点...我不想让其他开发人员创建投影机时想要创建空间和事件。 – kuceram 2012-07-12 08:01:36
不是100%确定这是否可行,但我会尝试向Room添加构造函数,并在构造函数中放置'this.projector = new Projector()'语句。 – proflux 2012-07-12 12:47:14