2012-09-26 38 views
1

我想知道如果下面的場景是一個Grails錯誤,或者如果簡單地有一種不同的方式,我需要表示遞歸關係。當一個getter返回同一個類時,自引用hasMany拋出了MappingException

創建一個Grails 2.1.0應用程序(使用創建應用內)和下(使用創建域類)域類產生上的MappingException「的grails運行應用」:

class Person { 
    static hasMany = [neighbours:Person] 

    public Person getBestFriend() { 
     return null 
    } 
} 

Caused by MappingException: Foreign key (FKC4E39B558E488775:person [])) must have same number of columns as the referenced primary key (person [id]) 
->> 303 | innerRun in java.util.concurrent.FutureTask$Sync 
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
| 138 | run  in java.util.concurrent.FutureTask 
| 886 | runTask in java.util.concurrent.ThreadPoolExecutor$Worker 
| 908 | run  in  '' 
^ 662 | run . . in java.lang.Thread 

如果getBestFriend()有返回類型Object或任何其他類型,應用程序啓動罰款。同樣可以更改Person類型的neighbours hasMany。加入static transients = ['bestFriend']沒有任何變化。

這個異常主要出現在我的搜索引用具有複合鍵的子對象時,但我無法找到類似於此示例的情況。提前感謝您的幫助!

+0

創建JIRA針對此問題:http://jira.grails.org/browse/GRAILS-9453 – mwersch

回答

0

我在這裏嘗試過,發生同樣的問題。一種解決方案是使用named queries

class Person { 

    static hasMany = [neighbours:Person] 

    //static transients = ['bestFriend'] 

    //public Person getBestFriend() { 
//  return null 
// } 

    static namedQueries = { 
     bestFriend { 
     } 
    } 


    static constraints = { 

    } 
} 
+0

如果'bestFriend'是Person'的'的財產該解決方案是可行的。儘管如此,它需要將GORM方法(list(),get()等)暴露給客戶端代碼,這對我來說並不美味。然而,如果'getBestFriend()'沒有檢索一個持久化屬性,比如說簡單地返回'新的Person()',我不認爲命名查詢就足夠了。 – mwersch

相關問題