J'ai deux entités, une Shelf
et Product
:Pourquoi Session.Flush() est-il requis pour la persistance des relations?
public class Shelf
{
public virtual IList<Product> Products { get; set; }
public Shelf()
{
Products = new List<Product>();
}
}
public class Product
{
public virtual string Name { get; set; }
}
Fondamentalement, un PUT Shelf
peut contenir beaucoup Products
, et un Product
peut être mis sur un grand nombre Shelves
. Ainsi, il existe une relation plusieurs-à-plusieurs unidirectionnelle entre Shelf
et Product
. Quand je lance le code suivant:
var shelf = new Shelf();
var product = new Product { Name = "Peas" };
shelf.Products.Add(product);
using (var session = SessionFactory.OpenSession())
{
session.Save(shelf);
}
NHibernate sauvera le Product
et le Shelf
, mais il ne sauvera pas la relation entre eux, donc si vous récupérez le Shelf
, il contiendra zéro Products
. Cependant, si j'ajoute un appel session.Flush()
, il enregistrera correctement la relation de sorte que la récupération du Shelf
retournera Product
.
Ce blog détails post ma question:
http://www.neeraj.name/2005/07/02/hibernate-session-close-does-not-call-session-flush.html
Cependant, je me demandais pourquoi je besoin de cet appel session.Flush()
. Il semble contre-intuitif que sauver un Shelf
avec le bon comportement en cascade permettra d'économiser le Product
, mais ne parvient pas à établir la relation entre les deux à moins que je vide la session. Il me semble qu'un appel Save()
devrait sauver tout, et pas seulement l'entité eux-mêmes sans leurs relations.
Merci Diego, ça répond parfaitement à ma question! –