Я хочу создать (один) экземпляр класса домена (который, как и ожидалось, имеет интерфейс GORM для моей базы данных) и использовать его только как контейнер для передачи данные вокруг, как объект Map. Я хочу быть абсолютно уверен в том, что мой экземпляр никогда не сохранится в базе данных. Боюсь, что GORM, при всей его хитрости, каким-то образом сумеет сохранить его в базе данных за кадром даже без явного вызова save(). Есть ли способ указать предложение «не сохранять это» при создании экземпляра моего объекта? Я знаю, как предотвратить сохранение в доменном классе, я хочу предотвратить сохранение только в конкретном экземпляре класса.

Решение, которое у меня есть сейчас, - создать класс в groovy/src/, который несет те же свойства и методы, и использовать его в качестве контейнера данных, а также при необходимости выполнять приведение типов. Это кажется неправильным, не работает DRY и хакерским.

Конечно, вы также можете сказать мне, что я должен перестать быть таким параноиком и что Grails никогда не сохранит экземпляр класса домена без явного сохранения.

1
sebnukem 7 Мар 2015 в 00:57

2 ответа

Лучший ответ

Grails не сохранит экземпляр вашего доменного класса без явного вызова save() в экземпляре. Вы можете создать экземпляр и передать его, и он не будет сохраняться.

4
blacktide 7 Мар 2015 в 19:55

Предположим, вы уже знаете, как предотвратить сохранение (создание таблицы) в доменном классе. Кроме того, вы также знаете, что без явного объекта .save () не будет сохраняться. Итак, чего вы хотите на самом деле? Это похоже на ... даже если кто-то случайно вызовет obj.save (), он никогда не сохранится. Хотя в этом нет никакого смысла, но, согласно вашему запросу,

Есть ли способ указать предложение «не сохранять это» при создании экземпляра моего объекта?

Да, есть способ:

class MyFishyDomain {
 String pwd
 // properties 
 // constraints

   def beforeInsert() {
      if (!this.pwd.equals("drago")) return false
    }
    def beforeUpdate () {
      if (!this.pwd.equals("drago")) return false
    }

}

Сейчас..

new MyFishyDomain(pwd:"drago").save()  // success
new MyFishyDomain(pwd:"rambo").save()  // fail

Кстати, если вы хотите навсегда отключить Create + Update + Delete, но в то же время хотите отправить запрос к домену, тогда решение:

static mapping = {
   cache usage: "read-only"
}
def beforeInsert() {
   return false
}
7
Mirza Ehsanul Haque 10 Мар 2015 в 10:13