Как изменить объект модели класса домена с одного производного класса на другой в Grails / GORM - PullRequest
2 голосов
/ 20 апреля 2011

Учитывая следующие доменные классы Grails GORM и использование наследования таблиц на иерархии:

class Book {
  static belongsTo = [ parent: Parent ]
  String title
}

abstract class Parent {
  static hasMany = [ books: Book ]
}

class A extends Parent {
  String asset
}

class B extends Parent {
  String asset
}

Скажем, я получил экземпляр класса A из базы данных.Я хочу преобразовать его в экземпляр класса B. Что такое идиоматический способ Grails для этого?

Без отношения hasMany я бы просто удалил A и создал новый B. Но я не хочунакладные расходы, связанные с просмотром большого количества книг и обновлением их полей parent_id, чтобы они указывали на новый B.

В сущности, я просто хочу выполнить SQL UPDATE, чтобы изменить поле базы данных parent.class изОт A до B. Итак, каков рекомендуемый способ сделать это в GORM / Grails?

Ответы [ 2 ]

1 голос
/ 20 апреля 2011

Похоже на признак недостатка дизайна.

Вы можете попытаться заменить наследование агрегацией - "Сочетание композиции объекта с наследованием класса". (Gang of Four 1995: 20) " - извлечь, скажем, HasAsset интерфейс из Parent и добавить ссылку на HasAsset.

Отличная делегация может помочь.

1 голос
/ 20 апреля 2011

Это не поддерживается в Grails или Hibernate, поскольку это аналог изменения экземпляра A в B в памяти, но объект имеет фиксированный тип и не может измениться.Нет прямого доступа к столбцу дискриминатора, для которого вам нужно изменить значение.

Таким образом, способ сделать это через обновление SQL, как вы сказали.Есть несколько вариантов, но лучший, вероятно, groovy.sql.Sql, например,

import groovy.sql.Sql

class FooService {
   def dataSource

   void convertToB(A a) {
      def sql = new Sql(dataSource)
      sql.executeUpdate('update parent set class=? where id=?', [B.name, a.id])
   }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...