Comment fonctionne l'objet détaché en hibernation
Je sais que l'objet est dans l'état détaché quand on a déjà frappé de sauver et nous re-joindre.
Supposons que j'ai un formulaire avec des champs de texte html et il y a le bouton enregistrer qui enregistre le texte dans la base de données.
j'ai ce code
public void edit(Person person) {
logger.debug("Editing existing person");
//Retrieve session from Hibernate
Session session = sessionFactory.getCurrentSession();
//Retrieve existing person via id
Person existingPerson = (Person) session.get(Person.class, person.getId());
//Assign updated values to this person
existingPerson.setFirstName(person.getFirstName());
existingPerson.setLastName(existingPerson.getLastName());
existingPerson.setMoney(existingPerson.getMoney());
//Save updates
session.save(existingPerson);
}
Maintenant je peux l'enregistrer n'importe quel nombre de temps pour enregistrer les données.
Maintenant, est-ce à dire qu'une fois que j'ai frappé enregistrer une première fois , il se détache.
Donc, dois-je faire quelque chose de spécial pour que ou il n'a pas d'importance.
Je veux savoir dans quel état j'ai besoin de programmer quoi que ce soit sur détaché de l'état
source d'informationauteur
Vous devez vous connecter pour publier un commentaire.
Dès que la session utilisé pour enregistrer, de charger, d'obtenir ou de trouver une entité a été fermé, l'entité devient détaché. Cela signifie qu'il n'est pas connecté plus d'une session, et fonctionne comme n'importe quel autre POJO.
Lorsqu'une entité est attaché et que vous modifiez l'une de ses propriétés, mise en veille prolongée enregistre automatiquement les modifications apportées à la ligne correspondante dans la base de données (à la chasse et au moment de la validation).
Quand il est détaché, les modifications apportées à l'objet ne sont pas enregistrées automatiquement dans la base de données. Pour enregistrer les modifications, vous devez le faire vous-même, par la convocation de la séance.mise à jour() ou de la session.merge(). Les deux méthodes font plus ou moins la même chose, mais le faire différemment. Je préfère personnellement à l'aide de fusion, qui est moins dangereux et conduit à moins de bugs.
Lire http://docs.jboss.org/hibernate/core/3.6/reference/en-US/html_single/#objectstate-detached pour plus de détails
Dans votre code, la personne est passée en argument à la méthode edit est probablement détaché. Ce que vous faites, c'est d'obtenir la personne avec le même ID que l'on est passé de la session.
existingPerson
est donc attaché. Ensuite, vous copiez toutes les propriétés de la personne détachée à l'attaché existingPerson. Et enfin, vous enregistrez le existingPerson.Il y a 3 problèmes avec ce code :
Il doit donc être modifié pour :