Grails组合的不同行为

Grails组合的不同行为,grails,gorm,Grails,Gorm,我们在使用hasMany关系使用Grails关联映射时遇到了一个非常奇怪的问题。我们将Grails2.4.4与hibernate 3.6.10.18结合使用 我们有以下三个领域结构: 人形 Activity.groovy 引发的异常是打印id的位置: 2015-04-01 12:02:40,886 [http-bio-8080-exec-6] ERROR hibernate.AssertionFailure - an assertion failure occured (this may in

我们在使用hasMany关系使用Grails关联映射时遇到了一个非常奇怪的问题。我们将Grails2.4.4与hibernate 3.6.10.18结合使用

我们有以下三个领域结构:

人形

Activity.groovy

引发的异常是打印id的位置:

2015-04-01 12:02:40,886 [http-bio-8080-exec-6] ERROR hibernate.AssertionFailure  - an assertion failure occured (this may indicate a bug in Hibernate, but is more likely due to unsafe use of the session)
org.hibernate.AssertionFailure: collection [com.org.Favorite.persons] was not processed by flush()
    at org.grails.datastore.gorm.GormStaticApi$_methodMissing_closure2.doCall(GormStaticApi.groovy:102)
    at com.org.ActivityService.save(ActivityService.groovy:50)
    at com.org.ActivityController.save(ActivityController.groovy:137)
    at grails.plugin.cache.web.filter.PageFragmentCachingFilter.doFilter(PageFragmentCachingFilter.java:200)
    at grails.plugin.cache.web.filter.AbstractFilter.doFilter(AbstractFilter.java:63)
    at grails.plugin.springsecurity.web.filter.GrailsAnonymousAuthenticationFilter.doFilter(GrailsAnonymousAuthenticationFilter.java:53)
    at grails.plugin.springsecurity.web.authentication.RequestHolderAuthenticationFilter.doFilter(RequestHolderAuthenticationFilter.java:49)
    at grails.plugin.springsecurity.web.authentication.logout.MutableLogoutFilter.doFilter(MutableLogoutFilter.java:82)
    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:744)
我试图深入研究GormStaticApi的代码,并遵循一些代码,发现最喜欢的域类具有无效的hasMany和belongsTo引用映射。当我们从Favorite域类中删除该映射时,不会发生异常


为什么这段代码以前运行过,为什么我们不能在本地环境中重现?在上次部署之前,没有任何更改。

这是您在上面粘贴的实际代码吗?您真的在代码中使用Favorite.get1和Favorite.get2吗?还是它的动态?activityservices中的第50行是什么?它实际上是动态的,ID过去来自客户端,但系统中肯定存在所有ID。在活动域中,您有static belongsTo=Person-因此您没有Person类型的属性,我想知道你怎么做activityInstance.setPersonpersonInstance-没有这样的属性你应该粘贴实际的代码问题的根源可能在那里抱歉@sudhir,我的错。我已经更新了活动域类的代码。
package com.org

Favorite {

    String name

    static hasMany = [persons: Person]
    static belongsTo = Person
}
package com.org

Activity {
    String title
    List<Favorite> favorites = []

    static hasMany = [favorites: Favorite]
    static belongsTo = [person: Person]
}
Person personInstance = Parson.first()  // Valid saved person instance
Activity acitivityInstnace = new Activity([title: "example"])
activityInstance.addToFavorites(Favorite.get(1))   // Both instance already exists
activityInstance.addToFavorites(Favorite.get(2))
activityInstance.setPerson(personInstance)
activityInstance.save()
println activityInstance.id
2015-04-01 12:02:40,886 [http-bio-8080-exec-6] ERROR hibernate.AssertionFailure  - an assertion failure occured (this may indicate a bug in Hibernate, but is more likely due to unsafe use of the session)
org.hibernate.AssertionFailure: collection [com.org.Favorite.persons] was not processed by flush()
    at org.grails.datastore.gorm.GormStaticApi$_methodMissing_closure2.doCall(GormStaticApi.groovy:102)
    at com.org.ActivityService.save(ActivityService.groovy:50)
    at com.org.ActivityController.save(ActivityController.groovy:137)
    at grails.plugin.cache.web.filter.PageFragmentCachingFilter.doFilter(PageFragmentCachingFilter.java:200)
    at grails.plugin.cache.web.filter.AbstractFilter.doFilter(AbstractFilter.java:63)
    at grails.plugin.springsecurity.web.filter.GrailsAnonymousAuthenticationFilter.doFilter(GrailsAnonymousAuthenticationFilter.java:53)
    at grails.plugin.springsecurity.web.authentication.RequestHolderAuthenticationFilter.doFilter(RequestHolderAuthenticationFilter.java:49)
    at grails.plugin.springsecurity.web.authentication.logout.MutableLogoutFilter.doFilter(MutableLogoutFilter.java:82)
    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:744)