Как я могу иметь необязательное отношение один к одному в GORM?

У меня есть 2 объекта, ObjectA и ObjectB.

Когда создается ObjectA, ObjectB еще не существует (и не может из-за отсутствия данных).

После создания ObjectB к нему должен быть присоединен соответствующий ObjectA, если соответствующий существует. Если нет подходящего ObjectA, то новый ObjectB просто не связан с ним.

Таким образом, все экземпляры ObjectA в конечном счете будут присоединены к ObjectB, но не все экземпляры ObjectB будут иметь ObjectA.

По сути, я ищу GORM для создания таких таблиц базы данных:

ObjectA
- Id (NotNull, unique)
- ObjectB_Id[FK: ObjectB.Id] (unique)

ObjectB
- Id (NotNull, unique)

Как мне собрать классы предметной области GORM для этого?

Я перепробовал почти все комбинации hasOne, belongsTo, необработанных свойств, nullable: true и unique: true ограничений, которые только мог придумать, но должно быть что-то упущено. Это не кажется особенно странным сценарием, поэтому должен быть какой-то способ добиться этого.


person cdeszaq    schedule 21.02.2012    source источник


Ответы (1)


Как это часто бывает, объединение моих мыслей в вопрос привело меня к решению:

Class ObjectA {
    ObjectB objectB

    static constraints = {
        objectB nullable: true, unique: true
    }
}

Class ObjectB {
    static belongsTo = [objectA: ObjectA]

    static constraints = {
        objectA nullable: true
    }
}

Единственная загвоздка в этом, которую я не могу обойти, заключается в том, что можно установить ObjectB.objectA в ObjectA, который уже связан с ObjectB. При сохранении новой ассоциации GORM просто не сохраняет ассоциацию. Ошибки не выдаются, и извлечение нового ObjectB из базы данных оставляет его свойство objectA неустановленным.

Добавление unique: true к ограничениям objectA в классе ObjectB тоже не помогает. Вместо молчаливого сбоя выдается ошибка, указывающая, что проверка уникальности не выполняется из-за неустановленного параметра.

person cdeszaq    schedule 21.02.2012