hibernate - example - ¿Por qué el campo con restricciones únicas falla en la actualización, en Grails?
spring security grails example (1)
Cuando tengo un atributo de identidad personalizado mapeado en una clase de dominio, ¿por qué hibernate verifica una restricción única? Cuando actualizo un objeto, la validación falla a pesar del hecho de que el valor del campo publicado es el mismo que el almacenado en DB. Esto ocurre, incluso si no hago ningún cambio en el formulario (asegurando que esté sucio: falso y sin errores de enlace de propiedad). Tengo una clase de dominio Grails como la siguiente:
class User {
Long profileId
String email
String username
String password
String title
String firstname
String lastname
String zipCode
Date lastLoginDate
static constraints = {
profileId nullable: true, blank: true
email blank: false, unique: true, email: true
username blank: false, unique: true
password blank: false
lastLoginDate nullable: true
firstname nullable: true
lastname nullable: true
zipCode nullable: true
}
static mapping = {
table ''USER_PROFILE''
id name:"profileId", column: "profile_id", generator: "sequence", params: [sequence:''userprofile_sequence'']
version false
}
}
Ahora, cuando creo un usuario con un mínimo conjunto de atributos, se crea un registro. Pero cuando trato de actualizar el mismo objeto como: def user = User.findByUsername (''akeel'') user.lastLoginDate = new Date () user.save (flush: true) No ocurre nada, porque falla la verificación de validación única. Puedo omitir la validación haciendo user.save (validate: false, flush: true) Pero no es una opción, ya que necesito validar el zipCode, siempre que un usuario lo agregue.
Tuve que establecer la restricción para la columna de identidad personalizada, profileId, como valor nulable verdadero, para resolver el problema de "columna repetida en la asignación" tal como se propuso aquí .
Esta pregunta es exactamente como la que se discute aquí , pero las soluciones propuestas no me funcionaron.
Estoy usando Grails 2.1.2, avíseme si se requiere algo más para comprender el problema.
Parece que un nombre de propiedad personalizado para la clave principal no funciona en Grails. profileId
con Grails 2.0.4, 2.2.4 y 2.3.4 y todos no reconocen profileId
como clave principal. User.get(1)
funciona bien, pero user.ident()
devuelve null
. Ciertamente plantearía un problema en el Grails JIRA.
La solución más simple es eliminar la propiedad profileId
y simplemente usar la id
integrada. Luego simplemente elimine el name:
valor de la asignación personalizada. En otras palabras, debes terminar con
id column: "profile_id", generator: "sequence", params: [sequence:''userprofile_sequence'']