Friday, September 11, 2009

NHibernate.AssertionFailure was unhandled possible nonthreadsafe access to session

One of our project we faced this issue, my teammates and i worked to reproduce this.

How to Reproduce -

namespace NHibernatePossibleThreadIssue
{
public class Program
{
private static ISession Session;

public static void Main(string[] args)
{
Configuration conf = new Configuration();
IDictionary properties = new Dictionary
{
{"hibernate.connection.driver_class", "NHibernate.Driver.OracleClientDriver"},
{"hibernate.connection.connection_string", "Data Source=XE; user ID=sso; Password=sso"},
{"hibernate.dialect", "NHibernate.Dialect.Oracle9Dialect"},
{"hibernate.show_sql", "true"}
};


conf.SetProperties(properties);
conf.AddClass(typeof (SomeDomain));
conf.AddClass(typeof (SomeChild));
ISessionFactory factory = conf.BuildSessionFactory();

Session = factory.OpenSession();
LoadInSessionTwice();


//ConfigureCastle();

//TryThreading();
Console.ReadKey();


}

private static void LoadInSessionTwice()
{

SomeDomain domain = Session.Load(91286L);
IQuery query = Session.CreateQuery(" from SomeDomain d where d.desc= :desc ");
query.SetParameter("desc", "helloworld");
SomeDomain evicted = query.List()[0];

Session.Evict(evicted);
Session.Flush();

}

Mapping and domain classes

public class SomeDomain
{
public long id { get; set; }
public string desc { get; set; }

private SomeChild child;

public SomeChild Child
{
get
{
if (child == null)
child = new SomeChild {Domain = this};

return child;
}
set { child = value; }
}

}

public class SomeChild {

public long Id { get; set; }

public SomeDomain Domain { get; set;}

public string description { get; set; }

}

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="NHibernatePossibleThreadIssue">
<class name="NHibernatePossibleThreadIssue.SomeDomain" lazy="false" table="SOMEDOMAIN">
<id name="id" type="long" column="ID" unsaved-value = "0" >
<generator class="native">
<param name="sequence">COR_SEQ</param>
</generator>
</id>
<property name="desc" column="text"/>
<one-to-one name="Child"
class="NHibernatePossibleThreadIssue.SomeChild" cascade="all-delete-orphan"/>

</class>
</hibernate-mapping>

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="NHibernatePossibleThreadIssue">
<class name="NHibernatePossibleThreadIssue.SomeChild" lazy="false" table="SOMECHILD">
<id name="Id" column="SD_ID">
<generator class="foreign">
<param name="property">Domain</param>
</generator>
</id>
<one-to-one name="Domain" class="NHibernatePossibleThreadIssue.SomeDomain" constrained="true"/>
<property name="description"/>
</class>
</hibernate-mapping>

No comments: