2015-09-01 6 views
1

J'essaie de mettre à jour un objet persistant sous forme d'utilisateur.
Mon POJO Classe:SpringMVC + Hibernate - Attribut de modèle et mise à jour

public Class MyModel { 
    int primKey; 
    String value; 
    // getter setter 
} 

Méthodes du contrôleur:

@RequestMapping(value="/update/{id}", method=RequestMethod.GET) 
    public String getEditView(@PathVariable int id, ModelMap model) { 
     MyModel mymodel = modelService.getModel(id); 
     model.addAttribute("mymodel", mymodel); 
     return "/edit"; 
    } 

@RequestMapping(value="/update", method=RequestMethod.POST) 
public String updateModel(@ModelAttribute("mymodel") MyModel mymodel, HttpSession session) { 
    session.setAttribute("status", modelService.update(mymodel) ? "success" : "error"); 
    return "redirect:/home"; 
} 

Et ma forme d'édition:

<form:form modelAttribute="mymodel" role="form" method="post" action="/update"> 
<label>Enter new name:</label> 
<form:input path="value"/> 
<input type="submit" class="btn btn-default" value="Update" /> 
</form:form> 

Maintenant, ma question est quand je reçois attribut modèle "mymodel" dans updateModel (), le champ "valeur" est rempli correctement mais le champ "primKey" est mis à 0 ce qui conduit à un échec dans la méthode de mise à jour de Hibernate Session. Passer un objet persistant comme "mymodel" facilite l'affichage du formulaire de mise à jour car toutes les valeurs mappées sont définies automatiquement et l'utilisateur peut facilement les modifier. Donc, y a-t-il un moyen de gérer cela ou devrais-je passer un nouvel attribut MyModel comme modèle et mettre à jour l'objet persistant après?

+0

Etes-vous sûr que votre champ 'value' est rempli lorsque vous chargez le formulaire de mise à jour (GET) et que vous envoyez également votre formulaire (POST)? –

+0

Oui c'est. Mais il semble que je reçois un objet totalement nouveau. – user2578525

Répondre

1

changement int primKey; à Integer primaryKey;. Par défaut, les variables de classe int sont affectées à 0, mais Integer reste null.

Je suppose que vous voulez générer automatiquement le primaryKey et enregistrer un nouvel enregistrement (insert). Pour ce faire, primaryKey doit être null.

Mais puisque vous effectuez la mise à jour et l'insertion dans le même modèle JSP, vous devez avoir une liaison d'entrée masquée pour votre primaryKey. Mais si vous avez l'impression que la clé primaryKey contient des données sensibles, vous pouvez encoder la primaryKey et la conserver en tant que hiddenValue, puis la renvoyer, la décoder et obtenir la valeur réelle et l'utiliser.

0

primKey est 0 parce que vous utilisez int au lieu de Integer. int ne peut pas être null, donc par défaut 0 s'il n'est pas spécifié. Si vous modifiez votre primKey pour qu'il soit de type Integer, votre formulaire ne fournira pas de valeur et, par conséquent, primKey sera null et Hibernate sauvegardera l'objet comme un nouvel enregistrement.

+0

Il n'est donc pas possible d'utiliser l'objet persist comme attribut de modèle et je vais devoir fournir un objet factice et mettre à jour mon objet persist depuis un objet fictif? – user2578525

0

Comme @SeanAdkinson a souligné que vous devez changer de primKeyint à Integer.

De même, vous devez inclure un champ caché dans votre formulaire pour l'attribut primKey. Donc, à chaque fois qu'il y a une primKey, elle est également soumise lorsque vous soumettez votre formulaire.

<form:hidden path="primKey"/> 
+0

Est-il prudent de révéler la clé primaire en tant qu'attribut caché? – user2578525

+0

Je ne pense pas qu'il y ait une portée 'view' dans Spring pour jsp, donc vous aurez besoin de révéler la clé primaire en utilisant un champ caché. Votre contrôleur sera uniquement singleton. –

+0

@NamanGala Je ne pense pas que vous devez inclure un champ caché pour le primaryKey.Toutes les valeurs non liées sont retournées comme nulles ou comme valeurs par défaut, dans ce cas 0 pour la clé primaire –