Как мне сопоставить сущности в GORM, когда pk одной ссылки pk другой - PullRequest
1 голос
/ 15 июня 2011

Как лучше всего отобразить два объекта в GORM, если первичный ключ одной таблицы также является внешним ключом из другой таблицы.Например:

Вот одна таблица:

CREATE TABLE `table_a` (
`a_id` int(11) NOT NULL AUTO_INCREMENT, 
PRIMARY KEY (`a_id`)
)

И на pk этой таблицы 'a_id' ссылается следующая таблица:

CREATE TABLE `table_b` (
`b_id` int(11) NOT NULL AUTO_INCREMENT, 
 PRIMARY KEY (`b_id`), 
 KEY `b_id_fk` (`b_id`), 
 CONSTRAINT `b_id_fk` FOREIGN KEY (`b_id`) REFERENCES `table_a' (`a_id`)
 )

Как сделатьЯ сопоставляю две вышеуказанные сущности в Grails / GORM?Следующий код, очевидно, не будет работать, поскольку GORM выдаст исключение, говорящее «повторяющийся столбец в сопоставлении для сущности».

class TableB {

 TableA tableA
 static belongsTo = [TableA]

 static mapping = {
    id column:"b_id"
    version false
    tableA column:"b_id"
 }

 static constraints = {
    tableA unique: true
 }
}

Примечание: я использую grails 1.3.7, но могу переключиться на более новую версию, еслипроблема - это проблема, которая недавно была исправлена.Пожалуйста, дайте мне знать.

1 Ответ

2 голосов
/ 15 июня 2011

Я не знаю, применимо ли это к вашему случаю, но одну вещь, которую вы можете сделать, это отобразить TableB как подкласс TableA, используя стратегию наследования таблицы на подкласс. Отметьте Стратегии наследования в руководстве по Grails.

Итак, у вас будет:

class TableA {
    static mapping = {
        id column: 'a_id'
        table 'table_a'
        version false
        tablePerHierarchy false
    }
}

class TableB extends TableA {
    static mapping = {
        id column: 'b_id'
        table 'table_b'
        version false
    }
}

Проблема этого подхода заключается в том, что вы не можете создать объект TableB после создания объекта TableA. Как работает Hibernate: при создании нового экземпляра TableA создается запись в table_a. При создании нового экземпляра TableB создаются запись в table_a и запись в table_b с одинаковым идентификатором.

OTOH, я не могу придумать вескую причину для этой схемы, кроме сопоставления иерархии классов, подобной этой.

...