如何修改现有域并将新属性更新为Bootstrap?

时间:2015-09-17 18:27:55

标签: grails gorm

好吧,我会简化问题,以便您更好地理解它。 我有一个正在制作的软件,其中包含一个名为Person的域,其中包含一些属性。 我在Contact域中添加了一个名为Person的新属性,当我启动应用程序从Contact获取一些信息时,需要更新Person.AnotherContactObject

所以在Bootstrap.groovy我尝试这样做:

List<Person> persons = Person.findAll()
for(Person person : persons){
   person.contact = new Contact()
   person.save(flush:true)
}

我收到了这个错误:

context.GrailsContextLoader Error initializing the application: object references an unsaved transient instance - save the transient instance before flushing: com.test.Contact; nested exception is org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: com.test.Contact
org.springframework.dao.InvalidDataAccessApiUsageException: object references an unsaved transient instance - save the transient instance before flushing: com.test.Contact; nested exception is org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: com.test.Contact
    at BootStrap$_closure1.doCall(BootStrap.groovy:154)
    at grails.util.Environment.evaluateEnvironmentSpecificBlock(Environment.java:308)
    at grails.util.Environment.executeForEnvironment(Environment.java:301)
    at grails.util.Environment.executeForCurrentEnvironment(Environment.java:277)
    at java.util.concurrent.FutureTask.run(FutureTask.java:262)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    at java.lang.Thread.run(Thread.java:745)
Caused by: org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: com.test.Contact
    ... 8 more

好吧,我也尝试过这样解决方法:

创建新的Contact对象,将其保存,然后在person.contact中设置并保存person对象,但仍然存在相同的错误。

1 个答案:

答案 0 :(得分:0)

我假设Contact也是一个域类。您需要先保存Contact,然后才能保存Person

List<Person> persons = Person.findAll().each { person ->
   person.contact = new Contact().save(flush:true)
   person.save(flush:true)
}

当然,在保存之前不要忘记在Contact实例中设置所有不可为空的属性。