11
votes

Meilleure façon de mettre à jour certains champs d'un objet détaché sur hibernate?

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): xxx pré>

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).
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>

a) strong> revenir L'instance parent de la session à nouveau et remplacez à la main les champs mis à jour P> xxx pré>

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>

b) strong> stocker l'enfant quelque part (httpsession?) Et l'associer ce dernier. 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);


0 commentaires

3 Réponses :


0
votes

Vous pouvez modifier directement l'objet détaché, puis razeach l'objet à la session à l'aide de Fusionner méthode sur la session.


0 commentaires

10
votes

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>


0 commentaires

3
votes

a) rétrécit l'instance parent de la session à nouveau et remplacer à la main les champs mis à jour

Cela semble être la version la plus fonctionnelle que j'ai utilisée au cours des dernières années.

b) stocker l'enfant quelque part (httpsession?) Et associez-le ce dernier.

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é :)

c) définissez la relation entre parent et Enfant comme immutable.

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.


0 commentaires