Как игнорировать поле в доменном объекте при использовании метода сохранения GORM - PullRequest
0 голосов
/ 25 мая 2011

В моем приложении у меня есть объект «Домен пользователя», в котором есть несколько полей, включая поле пароля.Поле пароля представляет собой зашифрованную строку с использованием JASYPT.Для целей разработки я создаю нового пользователя при запуске, который жестко запрограммирован.Это выглядит так:

User user = new User(
    userId:"user1", userFname:"Joe", 
    userLname:"Blow", userMinit:"A",
    userEmail:"joe@blow.com", userPword:"password").save()

Когда вызывается функция save (), я считаю, что в фоновом режиме вызывается функция saveOrUpdate () в спящем режиме.Он сравнивает значения полей новых объектов домена с уже существующими значениями полей объекта домена, чтобы определить, должна ли запись быть вставлена ​​в базу данных или просто обновлять уже существующую запись.

Поскольку поле пароля всегдабудет новое значение из-за шифрования JASYPT каждый раз будет вставлять новую запись.

INSERT INTO USER VALUES(1,'joe@blow.com',
    'Joe','user1','Blow','A','','','',
    'gIkUvM9b6d5vrEhkKzqKz0U7uxqRpZFhiQrrBTDbKX0=')
INSERT INTO USER VALUES(2,'joe@blow.com',
    'Joe','user1','Blow','A','','','',
    'yap0S0mCb2CpGngcANpSWoLqlL6SozLYK4WbKYHSVEw=')

Вот класс домена:

@Table(name="user")
class User {

    String userId
    String userFname
    String userLname
    String userMinit
    String userEmail
    String userPword
    String userMisc1 = ""
    String userMisc2 = ""
    String userMisc3 = ""

    public User(){};

    static mapping = {
        version false
        columns {
            userId      column:'user_id'
            userFname   column:'user_fname'
            userLname   column:'user_lname'
            userMinit   column:'user_minit'
            userEmail   column:'user_email'
            userPword   column:'user_pword'
            userMisc1   column:'user_misc1'
            userMisc2   column:'user_misc2'
            userMisc3   column:'user_misc3'
        }

        userPword type: GormEncryptedStringType
     }

    static constraints = {}
}

Есть ли способ сказать,GORM игнорировать поле пароля при сохранении объекта домена, чтобы я не попадал с одним и тем же пользователем снова и снова в БД?

Спасибо за любую помощь.

Ответы [ 4 ]

6 голосов
/ 31 мая 2011

Отвечая на комментарий OPs, вы можете сделать свойства непостоянными в grails, добавив свойство transients в класс домена:

static transients = [ "userPword", "anotherOne" ]

Но, как указано выше, это не поможет решить вашу проблему,

Спасибо, Джим.

4 голосов
/ 25 мая 2011

Перед сохранением нового пользователя вы можете проверить, существует ли этот пользователь:

User user = User.findByUserId("user1") ?: new User(userId:"user1", userFname:"Joe",
                                                userLname:"Blow", userMinit:"A", 
                                                userEmail:"joe@blow.com",
                                                userPword:"password").save(flush: true)
0 голосов
/ 26 мая 2011

Указание GORM игнорировать поле пароля не решит вашу проблему.Если вы создаете новый экземпляр, а затем сохраняете его, hibernate всегда будет пытаться вставить этот объект, поскольку до этого момента он ничего не знает о нем - у него даже нет идентификатора.

Единственный способ сделать обновление - это сначала извлечь существующую запись из БД, обновить атрибуты, а затем сохранить.

Практически все выбирают решение, предложенное jjczopek - проверьтеесли он существует, если не создать и сохранить.

Кстати, я бы, вероятно, установил уникальные ограничения для userId, userEmail для записи пользователя - кстати, если вы сделаете это, другой способ решения вашей проблемы - это молчапоймать уникальную ошибку ограничения, которая будет выдана при добавлении того же userId & userEmail.

0 голосов
/ 26 мая 2011

Вы можете переопределить equals и hashCode, которые Hibernate использует для определения, является ли объект грязным.

Однако в вашем конкретном примере я думаю, что ответ jjczopek лучше, поскольку вы имеете дело с одним частным случаем, а не с поведением, которое вы желаете для всего приложения. Исключение обновлений для изменений паролей во всем приложении может оказать довольно серьезное влияние на управление пользователями с помощью любого вида пользовательского интерфейса.

...