Проблема взаимоотношений Grails «многие ко многим»

#grails

#grails

Вопрос:

У меня есть приложение, в котором объекты-владельцы могут иметь много объектов Account, а объекты Account могут иметь много объектов Owner. Я думал смоделировать это с помощью отношения «многие ко многим», но затем я понял, что мне также может понадобиться создать объекты Account, владелец которых не может быть определен немедленно или может быть создан в будущем ПОСЛЕ того, как учетная запись уже будет создана. Поэтому я не верю, что смогу использовать отношения Grails «многие ко многим» (я думаю). Итак, я просто собирался создать свойство в классе Owner, которое представляло бы собой список идентификаторов учетных записей (это были бы ссылки на учетные записи владельца), и свойство в классе Account, которое представляет собой список идентификаторов владельцев (это были бы ссылки на владельцев учетных записей). Есть идеи получше? Я чувствую, что это слишком старомодно и сродни способу выполнения указателей C .

Ответ №1:

Вы можете создать третий домен для разрешения отношения следующим образом

 class Owner{
    ...

    Set<Object> getObjects() {
        OwnerObject.findAllByOwner(this).collect { it.object } as Set // or replace with optimized criteria
    }
    ...
}

class Object{
    ...

    Set<Owner> getOwners() {
        OwnerObject.findAllByObject(this).collect { it.owner } as Set // or replace with optimized criteria
    }
    ...
}


class OwnerObject implements Serializable {

    Owner owner
    Object object

    boolean equals(other) {
        if (!(other instanceof OwnerObject)) {
            return false
        }
        other.owner?.id == owner?.id amp;amp; other.object?.id == object?.id
    }

    static OwnerObject get(long ownerId, long objectId) {
        find 'from OwnerObject where owner.id=:ownerId and object.id=:objectId',
                [ownerId: ownerId, objectId: objectId]
    }

    static OwnerObject create(Owner owner, Object object, boolean flush = false) {
        new OwnerObject(owner: owner, object: object).save(flush: flush, insert: true)
    }

    static boolean remove(Owner owner, Object object, boolean flush = false) {
        OwnerObject instance = OwnerObject.findByOwnerAndObject(owner, object)
        if (!instance) {
            return false
        }
        instance.delete(flush: flush)
        true
    }

    static void removeAll(Owner owner) {
        executeUpdate 'DELETE FROM OwnerObject WHERE owner=:owner', [owner: owner]
    }

    static void removeAll(Object Object) {
        executeUpdate 'DELETE FROM OwnerObject WHERE object=:object', [object: object]
    }

    static mapping = {
        id composite: ['object', 'owner']
        version false
    }
}
  

Комментарии:

1. Благодарим вас за подробное решение, Аамир Саахиб.

Ответ №2:

Честно говоря, я использовал отношение m2m только один раз за свою более чем 6-летнюю «Grails-карьеру». Вместо этого комбинация o2m и динамических запросов проще в реализации и обслуживании и обычно более производительна.

Комментарии:

1. Что означает «o2m»?