2012-09-11 35 views
0

我有客戶和訂單實體。在爲使用流暢Hibernate的客戶定義類時,爲什麼我們需要爲訂單列表屬性指定「受保護集」。爲什麼要保護一對多的關係屬性

public virtual IList<Order> Orders { get; protected set; } 

回答

2

您不需要在設置者上指定protected。這只是一個很好的設計。

如果setter上沒有指定訪問修飾符,它將默認具有與屬性本身相同的訪問修飾符(在您的案例中爲public)。當setter是公開的時候,你的班級的任何消費者都可以修改Orders屬性並將其設置爲另一個實例。

public class Customer 
{ 
    public virtual IList<Order> Orders { get; set; } 
} 

var customer = new Customer(); 
customer.Orders = new List<Order>(); 

當你定義在二傳手protected訪問修飾符,只有繼承的類將能夠修改屬性。對於其他任何消費者,Orders屬性顯示爲只讀。這實際上是一個encapsulation

NHibernate默認使用延遲加載。這是一種技術,一些屬性(通常是列表)不是立即加載,而是第一次使用。 NHibernate使用代理來實現這一點。代理類是動態創建的,它繼承自類Entity並覆蓋它的所有屬性。這就是你所有班級成員都有virtual的原因。

而且,爲了說明問題,當您定義protected set時,您允許NHibernate的動態代理修改您的Orders屬性。 Orders可能被初始化爲一些空的代理集合,並且當有人試圖讀取它時,數​​據庫加載將被觸發並且Orders屬性將被從數據庫加載的Order實例列表替換。

public class Customer 
{ 
    public virtual IList<Order> Orders { get; protected set; } 
} 

var customer = new Customer(); 
//customer.Orders = new List<Order>(); // error: can't modify property 

var orderCount = customer.Orders.Count; // this will trigger lazy-loading 
相關問題