J'utilise Hibernate en tant qu'ORM dans mon application Java. J'ai un projet < -> Personne manytomany-relation et le projet est le propriétaire de la cartographie.Mise en veille prolongée: mise à jour d'un objet -> des instructions de suppression non désirées sont également effectuées
Maintenant, j'ai le problème, que je veux mettre à jour le projet. Le projet a un identifiant, un nom, ... et un ensemble de personnes. Faire une mise à jour, les personnes sont tous supprimés dans la table de jointure Project_Person, les instructions SQL sur la console:
Hibernate: update Project set description=?, name=? where id=?
Hibernate: delete from Project_Person where project_id=?
Mais je ne veux pas que la déclaration de suppression est exécutée.
J'ai dans mon application Java:
this.projService.updateProject(p);
où p est le projet, mais d'une manière POJO sans l'Ensemble de personnes. Je pensais que, pour le rendre « Mise en veille prolongée-ready » Je fais cela dans une transaction séparée d'un findProjectById, donc je vais chercher le projet de la base de données:
Project proj = this.projService.findProjectById(p.getId());
proj.setName(p.getName());
proj.setDescription(p.getDescription());
donc j'obtenir l'objet du projet Hibernate prêt, changer la valeurs, puis dites-lui de mettre à jour le projet. Mais l'ensemble est dans la vue de débogueur un PersistentSet et il n'y a aucune personne dedans (je pense, parce qu'ils sont chargés paresseux). Mais la mise à jour avec un
session.update(p);
dans une nouvelle transaction, je reçois la déclaration de mise à jour et la déclaration de suppression indésirable. Comment puis-je éviter l'instruction delete?
Dois-je créer une instruction SQL spéciale pour que seuls les champs de la table de base de données que je veux mettre à jour soient mis à jour? Ou existe-t-il d'autres/meilleures solutions?
Cordialement.
Mise à jour Cela jette un LazyInitializationException:
public Project findProjectById(int projectId) {
SessionFactory sessionFactory = HibernateUtil.getSessionFactory();
Session sess = sessionFactory.getCurrentSession();
Transaction tx = sess.beginTransaction();
try {
Project project = (Project)sess.createQuery("from Project where id = "+projectId).list().get(0);
tx.commit();
System.out.println(project.getPersons().size());
return project;
} catch (IndexOutOfBoundsException ex) {
return null;
}
}
Capture d'écran du Débogueur:
http://img94.imageshack.us/img94/2020/screendebugger.png
HibernateUtil
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
public class HibernateUtil {
// SessionFactory of Hibernate
private static final SessionFactory sessionFactory;
static {
try {
sessionFactory = new Configuration().configure("/hibernate.cfg.xml").buildSessionFactory();
}
catch (Throwable ex) {
System.err.println("Initial SessionFactory creation failed. " + ex);
throw new ExceptionInInitializerError(ex);
}
}
public static SessionFactory getSessionFactory() {
return sessionFactory;
}
}
écrant avant l'tx.commit()
http://img808.imageshack.us/img808/9624/screendebugger2.png
très étrange. essayez d'imprimer la taille avant de valider la transaction. – Bozho
J'ai mis une capture d'écran du débogueur juste avant la ligne tx.commit(). Mise à jour: Mettre ici avant la ligne tx.commit() le getPersons(). Size(), je comprends! – Tim
Ainsi, la session est fermée après validation. Alors, que puis-je faire pour résoudre ce problème avec l'instruction de suppression SQL indésirable? – Tim