Comment faire pour récupérer à partir de " ne pas rincer la Session après qu'une exception se produit une erreur?
J'ai deux classes :
Utilisateur
class User {
//relationships. . . .
static belongsTo = [ company : Company, role : Role ]
static hasMany = [ holidays : Holiday ]
String login
String password
static constraints = {
login(unique:true,size:6..15)
}
String toString() {
this.login
}
}
Et une autre classe comme ceci:
Rôle:
class Role {
String roleName
String privilege
static hasMany = [ user : User ]
static constraints = {
privilege(nullable:true)
roleName(unique:true)
}
String toString() {
this.roleName
}
}
J'ai écrit un essai d'intégration, comme ceci :
def user1 = new User(login:"aravinth", password:"secret")
def user2 = new User(login:"anto", password:"secret")
def user3 = new User(login:"antoa", password:"secret")
def role1 = new Role(roleName:"manager").save()
def role2 = new Role(roleName:"devleoper").save()
role1.addToUser(user1)
role1.addToUser(user2)
role2.addToUser(user3)
assert "manager" == user1.role.roleName
Ce test fonctionne très bien. Mais quand j'ajoute cette ligne suivante au-dessus de mon code de test :
def roleMembers = Role.findByRoleName("manager")
J'obtiens le message d'erreur comme ceci :
null id in mnm.schedule.User entry (don't flush the Session after an exception occurs)
org.hibernate.AssertionFailure: null id in mnm.schedule.User entry (don't flush the Session after an exception occurs)
at org.grails.datastore.gorm.GormStaticApi.methodMissing(GormStaticApi.groovy:108)
at mnm.schedule.RoleItntegrationTests.testAddingRolesToUser(RoleItntegrationTests.groovy:44)
Ce qui se passe? Où j'ai eu tort?
Je suis en utilisant le Graal 2.0.
Merci d'avance.
OriginalL'auteur Ant's | 2011-12-26
Vous devez vous connecter pour publier un commentaire.
La raison pour laquelle vous obtenez cette erreur, c'est que lors de la déclaration de Rôle.findBy statique méthode est exécutée, la mise en veille prolongée(qui est utilisé par graal GORM) vérifie si "autoFlush" est nécessaire. Depuis le nouveau Rôle transitoire objets sont présents, Hibernate essaie de automaically rincer la session. Cependant, au point de nouveaux objets utilisateur sont présents qui n'ont pas encore été associées à un rôle (qui n'est pas nullable dans le domaine de l'Utilisateur). Par conséquent, si le rinçage, l'utilisateur de l'objet ne passe pas la validation, et a donc une valeur null id comme mentionné dans l'exception.
La façon de résoudre ce problème serait de faire toute la DB lire appels (comme findBy méthodes) avant de commencer création/mise à jour des entités de même type.
Une autre option (bien que pas très bonne ) est de définir le vidage de session en mode manuel.
OriginalL'auteur Anuj Arora
Si vous utilisez le Printemps de Sécurité de Base, la même erreur se produit si vous ajoutez la contrainte
size
ou vous créer un personnalisévalidator
pour vérifier si un "mot de passe" est égal à "confirmer le mot de passe". La solution est d'utiliser un objet de commande dans ces cas. Ce cas est résolu ici.En général, cette erreur peut se produire si certains de ces champs est nulle quand il ne doit pas être nul, mais il passe à la contrainte (généralement parce que certains d'erreur dans le code). La base de données a une valeur non null règle si l'entrée n'est pas créée. Graal montrera que laid erreur ensuite.
OriginalL'auteur chelder