Как глубоко клонировать объект домена в Grails 3.3.11? - PullRequest
0 голосов
/ 21 апреля 2020

Я пытаюсь deep clone мой объект домена. Он имеет около 10 однозначных сопоставлений, и, кроме того, их больше.

Я попробовал следующий фрагмент:

def deepClone() {
        def copy = this.class.newInstance()

        PersistentEntity entity = Holders.grailsApplication.mappingContext.getPersistentEntity(this.class.name)
        entity?.persistentProperties?.each { prop ->
            if (prop.isAssociation()) {
                if (prop.isOneToOne()) {
                    copy."${prop.name}" = this."${prop.name}"?.deepClone()
                } else if (prop.isOneToMany()) {
                    this."${prop.name}".each {
                        copy."addTo${StringUtils.capitalize(prop.name)}"(it?.deepClone())
                    }
                }
            } else if (prop.name != 'id') {
                if (this."${prop.name}" instanceof List) {
                    this."${prop.name}".each {
                        copy."addTo${StringUtils.capitalize(prop.name)}"(it)
                    }
                } else {
                    copy."${prop.name}" = this."${prop.name}"
                }
            }
        }

        return copy
    }

Но prop.isAssociation не найдено. Кто-нибудь знает, как проверить связь в grails 3.3.11. Раньше это работало в 1.3.7 версии.

1 Ответ

0 голосов
/ 21 апреля 2020

Я решил эту проблему со ссылкой из документации Обновление с Grails 3.2.x

Вот новый фрагмент кода:

def deepClone() {

        def copy = this.class.newInstance()
        Holders.grailsApplication.mappingContext.getPersistentEntity(this.class.name)?.persistentProperties?.each { prop ->
            if (prop instanceof Association) {
                if (prop instanceof OneToOne) {
                    copy."${prop.name}" = this."${prop.name}"?.deepClone()
                } else if (prop instanceof OneToMany) {
                    this."${prop.name}".each {
                        copy."addTo${StringUtils.capitalize(prop.name)}"(it?.deepClone())
                    }
                }
            } else if (prop.name != 'id') {
                if (this."${prop.name}" instanceof List) {
                    this."${prop.name}".each {
                        copy."addTo${StringUtils.capitalize(prop.name)}"(it)
                    }
                } else {
                    copy."${prop.name}" = this."${prop.name}"
                }
            }
        }
        return copy
    }

Согласно документации:

В интерфейсе GrailsDomainClassProperty было еще много методов для оценки типа свойства, таких как isOneToOne, isOneToMany et c. и хотя PersistentProperty не предоставляет прямых эквивалентов, вы можете использовать instanceof в качестве замены, используя один из подклассов, найденный в пакете org.grails.datastore.mapping.model.types.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...