2011-11-15 34 views
5

Tôi đang sử dụng phiên không trạng thái nHibernate để tìm nạp đối tượng, cập nhật một thuộc tính và lưu đối tượng trở lại cơ sở dữ liệu.NHibernate: không thể tìm nạp proxy bằng thông báo lỗi phiên không trạng thái

tôi tiếp tục nhận được thông báo lỗi:

proxy không thể được lấy bởi một stateless session

tôi có mã tương tự như làm việc ở những nơi khác, vì vậy tôi không thể hiểu tại sao đây không phải là đang làm việc. Có ai có bất kỳ ý tưởng những gì vấn đề có thể được?

Tôi đang cố cập nhật thuộc tính ScreenLockVersion.

Mapping:

<?xml version="1.0" encoding="utf-8" ?> 
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" 
        assembly="ApplicationUtilities" 
        namespace="ApplicationUtilities.Concurrency"> 
    <class name="Screen" table="concurrency_screen" dynamic-update="true" optimistic-lock="all"> 
    <id name="ID" column="screenID"> 
     <generator class="identity" /> 
    </id> 
    <property name="ScreenName" column="screenName" /> 
    <property name="SubScreenName" column="subScreenName" /> 
    <property name="ScreenLockID" column="screenLockID" /> 
    <property name="ScreenLockVersion" column="screenLockVersion" /> 
    <property name="ScreenLockRequired" column="screenLockRequired" /> 
    <many-to-one name="Parent" class="Screen" column="parentScreenID" /> 
    <many-to-one name="Identity" class="ApplicationUtilities.SystemIdentity.Identity" column="identityID" /> 
    <many-to-one name="Application" class="ApplicationName" column="applicationID" /> 
    <one-to-one name="LastModified" class="LastModified" property-ref="Screen" cascade="all" /> 
    <bag name="AffectedScreens" table="concurrency_affectedScreen" cascade="all"> 
     <key column="updatedScreenID" /> 
     <many-to-many column="affectedScreenID" class="Screen" /> 
    </bag> 
    <bag name="ChildScreens" table="concurrency_screen"> 
     <key column="parentScreenID" /> 
     <many-to-many column="screenID" class="Screen" /> 
    </bag> 
    </class> 
</hibernate-mapping> 

Code:

public class Screen : BaseDomain 
{ 
    private string screenName; 
    private string subScreenName; 
    private Screen parent; 
    private IList<Screen> childScreens = new List<Screen>(); 
    private IList<Screen> affectedScreens = new List<Screen>(); 
    private Guid screenLockID; 
    private int screenLockVersion; 
    private bool screenLockRequired; 
    private LastModified lastModified; 
    private Identity identity; 
    private ApplicationName application; 

    protected Screen() 
    { 
     this.parent = null; 
     this.screenLockRequired = false; 
    } 

    /// <summary> 
    /// Create new parent screen 
    /// </summary> 
    /// <param name="screenName">parent screenname</param> 
    public Screen(string screenName, ApplicationName application) 
    { 
     this.screenName = screenName; 
     this.subScreenName = null; 
     this.parent = null; 
     this.application = application; 
    } 

    /// <summary> 
    /// Create new subscreen 
    /// </summary> 
    /// <param name="screenName">parent screen name</param> 
    /// <param name="subScreenName">subscreen name</param> 
    /// <param name="parent">reference to parent screen</param> 
    public Screen(string screenName, string subScreenName, Screen parent, ApplicationName application) 
    { 
     this.screenName = screenName; 
     this.subScreenName = subScreenName; 
     this.application = application; 
     this.parent = parent; 
    } 

    #region Properties 
    public virtual IList<Screen> AffectedScreens 
    { 
     get { return affectedScreens; } 
     set { affectedScreens = value; } 
    } 

    public virtual Screen Parent 
    { 
     get { return parent; } 
     set { parent = value; } 
    } 

    public virtual IList<Screen> ChildScreens 
    { 
     get { return childScreens; } 
     set { childScreens = value; } 
    } 

    public virtual string ScreenName 
    { 
     get { return screenName; } 
     set { screenName = value; } 
    } 

    public virtual string SubScreenName 
    { 
     get { return subScreenName; } 
     set { subScreenName = value; } 
    } 

    public virtual Guid ScreenLockID 
    { 
     get { return screenLockID; } 
     set { screenLockID = value; } 
    } 

    public virtual int ScreenLockVersion 
    { 
     get { return screenLockVersion; } 
     set { screenLockVersion = value; } 
    } 

    public virtual bool ScreenLockRequired 
    { 
     get 
     { 
      if (parent != null) 
       return parent.ScreenLockRequired; 
      else 
       return screenLockRequired; 
     } 
     set { screenLockRequired = value; } 
    } 

    public virtual LastModified LastModified 
    { 
     get { return lastModified; } 
     set { lastModified = value; } 
    } 

    protected internal virtual Identity Identity 
    { 
     get { return identity; } 
     set { identity = value; } 
    } 

    public virtual ApplicationName Application 
    { 
     get { return application; } 
     set { application = value; } 
    } 
    #endregion 

    #region Methods 
    public override string ToString() 
    { 
     return ScreenName + SubScreenName; 
    } 

    public override bool Equals(object obj) 
    { 
     Screen other = obj as Screen; 

     if (other == null) 
      return false; 

     if (string.IsNullOrEmpty(SubScreenName)) 
     { 
      if(string.IsNullOrEmpty(other.SubScreenName)) 
       return ScreenName.Equals(other.ScreenName) && Application.Equals(other.Application); 
      else 
       return false; 
     } 
     else if (string.IsNullOrEmpty(other.SubScreenName)) 
      return false; 
     else 
      return ScreenName.Equals(other.ScreenName) && SubScreenName.Equals(other.SubScreenName) && Application.Equals(other.Application); 
    } 

    public override int GetHashCode() 
    { 
     if(SubScreenName == null) 
      return ScreenName.GetHashCode()^Application.GetHashCode(); 
     else 
      return ScreenName.GetHashCode()^SubScreenName.GetHashCode()^Application.GetHashCode(); 
    } 
    #endregion 
} 
+0

Bạn có thể đăng mã cho đối tượng được đề cập và ánh xạ của đối tượng đó không? –

+0

Chắc chắn, nó được thêm vào. – Matt

+0

không thực sự trả lời cho câu hỏi nhưng hàm tạo thứ hai có thể được viết là 'màn hình công cộng (string screenName, applicationName application): this (screenName, null, null, application) {}' – Firo

Trả lời

5

phiên Stateless không hỗ trợ lười biếng nạp. Bạn cần tải sớm các đối tượng Screen (trong cùng một truy vấn bạn hiện đang tải chỉ các proxy).

Các vấn đề liên quan