Je me demandais quelle est la meilleure façon de mettre à jour certains champs d'un objet détecté à l'aide de HB sur Java. Spécialement lorsque l'objet a des attributs d'objets enfants. Par exemple (Annotations supprimées et numéro de champs réduits pour réduire le bruit): Lors de la mise à jour d'un parent dans une webApp MVC, je pourrais appeler une instance parent à l'aide de session.get (parent. classe, 123) em>, utilisez-le pour remplir un formulaire et l'afficher. Pas de DTO, juste le parent détecté est transmis à la vue et lié à un formulaire. Maintenant, je veux seulement permettre à l'utilisateur de mettre à jour l'attribut Field2 em> du parent. Ainsi, lorsque l'utilisateur publie le formulaire, j'obtiens une instance parent avec l'ID et le champ Rempli2 (je pense que le cadre MVC ne comporte pas ici, tout se comporte principalement de la même manière lorsque la liaison). J'utilise beaucoup cela. Mais le pojoparent semble être utilisé comme un Dto sous couverture. Aussi, il devient horrible si le nombre de champs à mettre à jour augmente. P>
Maintenant, quelle stratégie est la meilleure pour effectuer la mise à jour de l'entité? Je peux penser dans quelques alternatives, mais je veux entendre les experts :) (N'oubliez pas que je ne veux pas perdre la relation entre le parent et les instances enfants) p> Parent parent = Session.get(Parent.class,123);
//bind the retrieved parent to the form
// store the Child from parent.getChild() on the httpSession
...
//when the users submits the form...
pojoParent.setChild(someHttpSessionContext.getAttribute('Child'))
Session.save(pojoParent);
3 Réponses :
Vous pouvez modifier directement l'objet détaché, puis razeach l'objet à la session à l'aide de Fusionner méthode sur la session. p>
Après avoir chargé un objet parent, vous avez dit
Maintenant, je veux seulement permettre à l'utilisateur de mettre à jour l'attribut de champ2 du parent p> blockQuote>
basé sur l'étui d'utilisation, vous pouvez utiliser un objet UpdaThaetingParent P>
@Repository public class ParentRepositoryImpl implements ParentRepository { @Autowired private SessionFactory sessionFactory; public void updateSpecificUseCase(UpdateableParent updateableParentObject) { Parent parent = sessionFactory.getCurrentSession().load(Parent.class, updateableParentObject.getId()); try { // jakarta commons takes care of copying Updateable Parent object to Parent object BeanUtils.copyProperties(parent, updateableParentObject); } catch (Exception e) { throw new IllegalStateException("Error occured when updating a Parent object", e); } } }
- C'est sûr: vous venez de mettre à jour ce que vous voulez vraiment li>
- Vous n'avez pas à vous soucier du framework MVC (un cadre MVC vous permet de configurer une propriété autoriséefields). Que se passe-t-il si vous oubliez des champs autorisés ??? Li> ul>
Bien que ce ne soit pas une question liée à la technologie, couture framework vous permet de mettre à jour ce que vous vouloir. Donc, vous n'avez pas à vous soucier de quel modèle à utiliser. P>
Cordialement, P> P>
a) rétrécit l'instance parent de la session à nouveau et remplacer à la main les champs mis à jour p> blockQuote>
Cela semble être la version la plus fonctionnelle que j'ai utilisée au cours des dernières années. P>
b) stocker l'enfant quelque part (httpsession?) Et associez-le ce dernier. p> blockQuote>
Je conseillerais contre cela, surtout si vous souhaitez suivre le paradigme de repos qui rend le serveur à l'état du côté NO-Non. Et vous finirez par utiliser de l'espace de tas pour des objets détachés, bien que l'utilisateur qui a initié la session à gauche pour le café :) p>
c) définissez la relation entre parent et Enfant comme immutable. P> blockQuote>
IMHO Ce n'est pas un bon sens non plus, bien qu'il soit apte à un petit projet avec un petit modèle de persistance. Mais même dans une petite application, cela pourrait conduire à un mal de tête lorsque vous essayez de modifier le code. P>