2013-04-09 43 views
2

我有一個遺留數據庫,我正在使用它來映射grails 2.2.1應用程序中的域對象。Grails/Gorm - 將域對象與自身相關1:M

我正在使用的表格包含FK關係,回到自己的孩子。幸運的是,我知道我只需要在層次結構中深入一層。

T_FOO 
---------------------- 
I     LONG 
CHILD_FOO   LONG 

這是可能的結果集:

I CHILD_FOO 
- --------- 
1 NULL 
2 NULL 
3 1 
4 1 
5 2 

我的域對象是這樣的:

class Foo { 
    long instanceId 
    static hasMany = [childFoos: Foo] 

    static mapping { 
     table 'T_FOO' 
     id generator: 'assigned', name: 'instanceId', column: 'I', type: 'long' 
     version false 
     autoTimestamp false 
     instanceId column: 'I' 

     // I tried joining the table to itself and it didn't work 
     childFoos joinTable [name: 'T_FOO', key: 'CHILD_FOO', column: 'I' 
    } 
} 

查詢不起作用。 Hibernate把一個t0.class放到選擇列表中,它失敗了。

有什麼建議嗎?

問候, 羅賓

回答

0

這是混亂的,但我最終通過創建包含原來的類的引用另一個域類問題的解決。我想找一個更好的方法,但是現在這會起作用。

數據庫表我與測試:

mysql> desc t_foo; 
+-------------+-------------+------+-----+---------+-------+ 
| Field  | Type  | Null | Key | Default | Extra | 
+-------------+-------------+------+-----+---------+-------+ 
| I   | bigint(20) | NO | PRI | NULL |  | 
| Description | varchar(45) | YES |  | NULL |  | 
| I_CHILDFOO | bigint(20) | YES |  | NULL |  | 
+-------------+-------------+------+-----+---------+-------+ 

mysql> select * from t_foo; 
+---+--------------+------------+ 
| I | Description | I_CHILDFOO | 
+---+--------------+------------+ 
| 1 | Parent 1  |  NULL | 
| 2 | Parent 2  |  NULL | 
| 3 | Child 1 of 1 |   1 | 
| 4 | Child 1 of 1 |   1 | 
| 5 | Child 1 of 2 |   2 | 
+---+--------------+------------+ 

我的課是這樣的:

package db.legacy 

class Foo { 

    long instanceId 
    String info 

    static hasMany = [ kids: ChildFoo ] 

    static constraints = { 
    } 

    static mapping = { 
     table 'T_FOO' 
     id generator: 'assigned', name: 'instanceId', column: 'I', type: 'long' 
     version false 
     autoTimestamp false 
     instanceId column: 'I' 
     info column: 'Description' 
     kids column: 'I_CHILDFOO' 
    } 
} 

class ChildFoo { 

    long instanceId 
    Foo parentFoo 

    static mapping = { 
     table 'T_FOO' 
     id generator: 'assigned', name: 'instanceId', column: 'I', type: 'long' 
     version false 
     autoTimestamp false 
     instanceId column: 'I' 
     parentFoo column: 'I_CHILDFOO' 
    } 
} 

當我做如下測試它的偉大工程:

def foo = db.legacy.Foo.get(1) 
foo.kids.each { bar -> 
    assert bar.parentFoo.instanceId == foo.instanceId 
} 

它只是看起來像這樣一個馬虎/哈克解決方案。如果任何人有任何想法或想法,我很樂意聽到他們。

Thx