Hi,
I am using NHibernate v5.4.9 and FluentNHibernate v3.4.0.
In this version, I am using batch fetching to improve performance.
*Configuration:*
Fluently.Configure().Database(MsSqlConfiguration.MsSql2012
.Dialect("RamSite.Repositories.NH.MsSqlConfiguration2012,
RamSite.Repositories")
.AdoNetBatchSize(100).ShowSql()
.ConnectionString(c => c.FromConnectionStringWithKey("connectionString")))
.Mappings(m =>
{
m.FluentMappings.AddFromAssembly(Assembly.GetExecutingAssembly());
m.HbmMappings.AddFromAssembly(Assembly.GetExecutingAssembly());
}).ExposeConfiguration(cfg =>
{
cfg.EventListeners.PreLoadEventListeners = new IPreLoadEventListener[] {
new PreLoadEventListener() };
cfg.EventListeners.PostLoadEventListeners = new IPostLoadEventListener[] {
new PostLoadEventListener() };
cfg.EventListeners.PostInsertEventListeners = new
IPostInsertEventListener[] { new PostInsertEventListener() };
cfg.EventListeners.PostUpdateEventListeners = new
IPostUpdateEventListener[] { new PostUpdateEventListener() };
cfg.EventListeners.PostDeleteEventListeners = new
IPostDeleteEventListener[] { new PostDeleteEventListener() };
cfg.SetProperty(NHibernate.Cfg.Environment.GenerateStatistics, "true");
*cfg.SetProperty(NHibernate.Cfg.Environment.DefaultBatchFetchSize, "100");*
cfg.SetProperty(NHibernate.Cfg.Environment.BatchFetchStyle,
BatchFetchStyle.Dynamic.ToString());
}).BuildSessionFactory();
*Mapping:*
OrderMap:
public OrderMap() { Table("tblOrder"); Id(x => x.Id); Map(x => x.Name);
Map(x => x.ProjectId, "SiteRevisionId"); Map(x => x.Note); Map(x =>
x.Locked); Map(x => x.WBSNumber); Map(x => x.Revision); HasMany(x =>
x.InternalOrderItems).KeyColumn("OrderId").AsSet().Inverse().LazyLoad().BatchSize(100);
Map(x => x.OptionalWBSNumber); References(x =>
x.SupplierContractor).Column("ContractorSupplierId").Fetch.Join().NotFound.Ignore();
Map(x => x.OptionalWBSNumber); }
*OrderItemMap:*
public OrderItemMap() { Table("tblOrderItem"); Id(x => x.Id); Map(x =>
x.OrderId); Map(x => x.OrderItemModelId); Map(x => x.Quantity);
DiscriminateSubClassesOnColumn<int>("OrderItemDescriminator", 0); } public
class TowerOrderItemMap : SubclassMap<TowerOrderItem> { public
TowerOrderItemMap() { DiscriminatorValue(1); Map(x => x.TowerHeight); Map(x
=> x.BasePlate); References(x =>
x.ParentOrderItem).Column("ParentOrderItemId").Fetch.Join().NotFound.Ignore();
HasMany(x =>
x.InternalOrderItemGroups).KeyColumn("OrderItemId").AsSet().Inverse().Not.LazyLoad();
Map(x => x.BaseAssemblyStructureNET); Map(x => x.BaseAssemblyBoltsNET);
Map(x => x.TowerStructureNET); Map(x => x.TowerBoltsNET); } }
*HQL:*
session.CreateQuery(@" from Order o where o.OrderStatusId = :orderStatusId
") .SetParameter("orderStatusId", orderStatusId) .List<Order>();
*Issue:*
In this configuration, I try to get all data in one select (using batch
fetching), but the order data is getting one select, but the OrderItem
executes each order one select statement. If there is any special reason
for this one. If anyone knows, please let me know.
1. In use of *default_batch_fetch_size* in config, how does batch
fetching work?
2. * In NHibernate, is the N+1 problem solved or not?*
3. Why are the parent and child getting separate select statements
running?
4. Is this configuration correct, or do I need to override anything in
the mapping or configuration?
5.
* I need a reason for using bath fetch. Why is the select statement run
separately? Output: [image: image] *
--
You received this message because you are subscribed to the Google Groups
"nhusers" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/nhusers/bb33b519-102f-430f-9d03-af5fa655acc9n%40googlegroups.com.