2011-05-05 4 views
3

J'essaie de prendre un JSONObject que j'ai posté sur mon contrôleur groovy. Je peux passer l'objet, voir les données JSON, puis créer un objet de domaine à partir de celui-ci. Lorsque je l'enregistre pour écrire dans la base de données, il effectue une sélection à la place.Grails save() Domain Object fait-il un Select?

def save = { 
    def input = request.JSON 
    def instance = new Customers(input) 
    instance.save() 
} 

ici est ma sortie de débogage SQL

Hibernate: 
select 
    this_.customers_id as customers1_237_0_, 
    this_.customers_default_address_id as customers2_237_0_, 
    this_.customers_dob as customers3_237_0_, 
    this_.customers_email_address as customers4_237_0_, 
    this_.customers_email_address2 as customers5_237_0_, 
    this_.customers_fax as customers6_237_0_, 
    this_.customers_firstname as customers7_237_0_, 
    this_.customers_gender as customers8_237_0_, 
    this_.customers_lastname as customers9_237_0_, 
    this_.customers_membertype as customers10_237_0_, 
    this_.customers_memo1 as customers11_237_0_, 
    this_.customers_mname as customers12_237_0_, 
    this_.customers_newsletter as customers13_237_0_, 
    this_.customers_password as customers14_237_0_, 
    this_.customers_point_date as customers15_237_0_, 
    this_.customers_telephone as customers16_237_0_, 
    this_.customers_total_points as customers17_237_0_, 
    this_.customers_username as customers18_237_0_ 
from 
    customers this_ 
where 
    this_.customers_username=? 

Je ne sais pas ce qui serait à l'origine de cette.

+0

pourriez-vous donner un exemple pour "entrée"? –

Répondre

7

On dirait que vous avez une contrainte unique sur le nom d'utilisateur. Grails effectue une sélection pour vérifier l'unicité, étant donné que la lecture d'une ligne est une action légère et qu'il est préférable de déclencher une violation de contrainte et une exception uniques.

Une alternative consiste à supprimer la contrainte unique dans la classe de domaine et à ajouter manuellement la contrainte unique dans la base de données.

+0

Oui, c'était une contrainte sur la colonne customers_point_date qui n'était pas nulle et donc je viens de définir une valeur par défaut si elle n'est pas là et alto, les inserts fonctionnent! Merci – JPM

+0

Corrigez-moi si je me trompe, mais le problème ici est que vous vous retrouviez avec autant de «vérifications» que de nombreux champs «uniques» que vous avez dans votre modèle. Donc, si vous avez deux champs 'uniques', cela générera deux requêtes au lieu d'une avec' OR'. –

+0

Bon, car les contraintes sont exécutées dans l'ordre - il n'y a aucune logique pour détecter que deux peuvent être fusionnées en une seule. –

0

Avez-vous essayé quelque chose comme:

Customers cust = new Customers(input); 
println ("cust = "+cust); 
cust.save(); 
Questions connexes