PDA

View Full Version : No CurrentSessionContext configured


mk77
01-26-2007, 11:50 AM
Hi,

I'm trying to use the HibernateTemplate to retrieve object using the Criteria API like:

return HibernateTemplate.SessionFactory.GetCurrentSession ().CreateCriteria(typeof(ClassInfo))
.Add(Expression.Gt("StartDate", System.DateTime.Now))
.List<ClassInfo>();

But I'm getting the "No CurrentSessionContext configured" error. What am I doing wrong?
I'm using the Spring.Data.NHibernate12-20070108-0201 build.

Thanks for you help.


[HibernateException: No CurrentSessionContext configured!]
NHibernate.Impl.SessionFactoryImpl.GetCurrentSessi on() +85
Pohs.DAL.NHibernate.NHibernateClassInfoDao.FindCla ssesBySearchCriteria(String search) in C:\Projects\.NET\Pohs\Pohs.DAL\NHibernate\NHiberna teClassInfoDao.cs:40
Pohs.BLL.ClassConfigurationManager.GetClasses(Stri ng searchCriteria) in C:\Projects\.NET\Pohs\Pohs.BLL\ClassConfigurationM anager.cs:77
SearchCourses.uxCourses_NeedDataSource(Object source, GridNeedDataSourceEventArgs e) in c:\Projects\.NET\Pohs\Pohs.Web\SearchCourses.aspx. cs:70
Telerik.WebControls.RadGrid.OnNeedDataSource(GridN eedDataSourceEventArgs e) +102
Telerik.WebControls.RadGrid.ObtainDataSource(GridR ebindReason rebindReason, Boolean IsBoundUsingDataSourceId) +76
Telerik.WebControls.RadGrid.AutoDataBind(GridRebin dReason rebindReason) +50
Telerik.WebControls.RadGrid.OnLoad(EventArgs e) +171
System.Web.UI.Control.LoadRecursive() +47
System.Web.UI.Control.LoadRecursive() +131
System.Web.UI.Control.LoadRecursive() +131
System.Web.UI.Control.LoadRecursive() +131
System.Web.UI.Control.LoadRecursive() +131
System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +1061

swalters
01-26-2007, 11:40 PM
We use:

ICriteria criteria = SessionFactoryUtils.GetSession(this.SessionFactory , true).CreateCriteria(typeof(Currency));

It works fine, but we're using the 12/28 codebase.

-Shane

mk77
01-27-2007, 11:46 PM
That worked.

Thanks.

Erich Eichinger
02-01-2007, 11:07 PM
Hi,

to take full advantage of Hibernate integration, Transaction support etc. you should better use the approach of implementing IHibernateCallback. HibernateTemplate itself uses this technique e.g. in LoadAll( Type entityType):


public IList LoadAll(Type entityType)
{
return (IList)Execute(new LoadAllByTypeHibernateCallback(this, entityType),true);
}

// callback implementation
internal class LoadAllByTypeHibernateCallback : IHibernateCallback
{
private HibernateTemplate outer;
private Type entityType;

public LoadAllByTypeHibernateCallback(HibernateTemplate template, Type entityType)
{
outer = template;
this.entityType = entityType;
}

public object DoInHibernate(ISession session)
{
ICriteria criteria = session.CreateCriteria(entityType);
outer.PrepareCriteria(criteria);
return criteria.List();
}
}



If you are working with NET 2.0, you can drastically shorten such code by using anonymous delegates:


public IList LoadAll(Type entityType)
{
return (IList)Execute(
delegate(ISession session)
{
ICriteria criteria = session.CreateCriteria(entityType);
PrepareCriteria(criteria);
return criteria.List();
}
);
}



Thus a DAO method using Criteria will typically look like


public IList LoadAll(Type entityType)
{
return (IList)HibernateTemplate.Execute(
delegate(ISession session)
{
ICriteria criteria = session.CreateCriteria(entityType);
HibernateTemplate.PrepareCriteria(criteria);
return criteria.List();
}
);
}



hth,
Erich

steinard
02-05-2007, 09:21 AM
Hi!

So if you have additional constraints that will narrow the search, these could be specified like this?


/// <summary>
/// Load a specific user by username.
/// </summary>
/// <param name="entityType"></param>
/// <param name="userName"></param>
/// <returns></returns>
[IsInterceptable]
public IPersistableUser LoadUserByUserName(Type entityType, string userName)
{
return (IPersistableUser)HibernateTemplate.Execute(delega te(ISession session)
{
ICriteria criteria = session.CreateCriteria(entityType);
criteria.Add(Expression.Like("UserName", userName));

HibernateTemplate.PrepareCriteria(criteria);
return criteria.UniqueResult();
}
);
}


Thanks,
Steinar.

Erich Eichinger
02-05-2007, 09:33 AM
Exactly. This should work perfectly.

-Erich

Mark Pollack
03-20-2007, 07:51 PM
Hi,

One small improvement is that you do not need to call

HibernateTemplate.PrepareCriteria(criteria);

since the exposed ISession implementation is a proxy that will automatically call 'PrepareCriteria', i.e. apply cache settings, fetch size, transaction timeouts, etc. If you want to use the 'raw' NHibernate ISession implementation then set HibernateTemplate's property "ExposeNativeSession" to true and you won't get this behavior.

Cheers,
Mark