Nhibernate 如果仅在实体类内部访问,LazyLoaded属性不会动态加载
我有一些大数据对象,存储在CompressedData属性中,所以我不想每次执行任何查询时都加载这些数据。所以我尝试在mapping类中将这个属性标记为LazyLoad()。 在实体类外无法访问CompressedData,因为我有UncompressedData属性,该属性提供了压缩/解压缩数据的功能。所以我只在TestEntity类中调用CompressedData。 但我遇到了麻烦。如果实体类外没有对此属性的请求,NHibernate 3.2.0.4000(或FluentNHibernate 1.3.0.717)不希望加载LazyLoad属性。若尝试运行测试,我将得到一个空字符串Nhibernate 如果仅在实体类内部访问,LazyLoaded属性不会动态加载,nhibernate,fluent-nhibernate,nhibernate-mapping,lazy-loading,Nhibernate,Fluent Nhibernate,Nhibernate Mapping,Lazy Loading,我有一些大数据对象,存储在CompressedData属性中,所以我不想每次执行任何查询时都加载这些数据。所以我尝试在mapping类中将这个属性标记为LazyLoad()。 在实体类外无法访问CompressedData,因为我有UncompressedData属性,该属性提供了压缩/解压缩数据的功能。所以我只在TestEntity类中调用CompressedData。 但我遇到了麻烦。如果实体类外没有对此属性的请求,NHibernate 3.2.0.4000(或FluentNHibernat
public class TestEntity {
public TestEntity(){}
public TestEntity(string otherData, string dataForCompress){
OtherData = otherData;
UncompressedData = dataForCompress;
}
public virtual string OtherData {get;set;}
public virtual byte[] CompressedData {get;set;}
public virtual string UncompressedData {
get {
return SomeLongFunctionForDecompress(CompressedData);
}
set {
CompressedData = SomeLongFunctionForCompress(value);
}
}
}
public class TestEntityMapping : ClassMap<TestEntity> {
public TestEntityMapping(){
Map(OtherData);
Map(CompressedData).LazyLoad();
}
}
[Test]
public void can_readLazyLoadedProperty(){
TestEntity obj1 = new TestEntity("test","long data here");
using (nHibernateHelper.CreateNewSession(){
Session.Save(obj1);
}
using (nHibernateHelper.CreateNewSession(){
TestEntity obj2 = Session.Get(obj1.Id);
//byte[] data1 = obj2.CompressedData;
string data2 = obj2.UncompressedData;
Assert.AreEqual("long data here",data2);
}
}
公共类测试{
公共测试实体(){}
公共测试实体(字符串otherData、字符串dataForCompress){
OtherData=OtherData;
UncompressedData=dataForCompress;
}
公共虚拟字符串OtherData{get;set;}
公共虚拟字节[]压缩数据{get;set;}
公共虚拟字符串解压数据{
得到{
返回一些长函数进行压缩(压缩数据);
}
设置{
CompressedData=SomeLongFunctionForCompress(值);
}
}
}
公共类TestEntityMapping:ClassMap{
公共测试映射(){
地图(其他数据);
Map(CompressedData).LazyLoad();
}
}
[测试]
public void可以读取LazyLoadedProperty(){
TestEntity obj1=新的TestEntity(“测试”,“此处的长数据”);
使用(nHibernateHelper.CreateNewSession(){
Session.Save(obj1);
}
使用(nHibernateHelper.CreateNewSession(){
TestEntity obj2=Session.Get(obj1.Id);
//字节[]数据1=obj2.CompressedData;
字符串数据2=obj2.UncompressedData;
AreEqual(“此处的长数据”,data2);
}
}
但是,如果取消注释
byte[]data1=obj2.compressedata;
line,一切正常。也许我需要为compressedata属性添加一些属性,或者为映射添加一些属性?我想.NET提供了与Java类似的机制,从您的描述来看,似乎是这样的:
Hibernate修改实体类,将它们包装在自己的对象中,这些对象修改getter以使LazyLoad工作
从内部调用getter可以调用未修改版本的getter,它不处理LazyLoad
所以这就是你得到的特性,而不是bug。解决方案可以是将逻辑移到实体之外,实体应该只有字段和访问器