我有一些大数据对象,存储在CompressedData属性中,所以当我进行任何查询时,我不想每次都加载这些数据。所以我试图在映射类中将此属性标记为LazyLoad()。 从实体类中无法访问CompressedData,因为我有UncompressedData属性,它提供压缩/解压缩数据的功能。所以我只在TestEntity类中调用CompressedData。 但我遇到了麻烦。如果实体类中没有对此属性的请求,NHibernate 3.2.0.4000(或FluentNHibernate 1.3.0.717)不想加载LazyLoad属性。如果尝试运行测试,我将得到一个空字符串。
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);
}
}
但如果取消注释byte[] data1 = obj2.CompressedData;
行一切正常。也许我需要为CompressedData属性添加一些属性或者为映射添加一些属性?
答案 0 :(得分:2)
我认为.NET提供了与Java类似的机制,并且从您的描述中看起来就是这样:
Hibernate修改实体类将它们包装在自己的对象中,修改getter以便LazyLoad正在工作
从内部调用getter调用未修改的getter版本,这些版本不处理LazyLoad。
所以你得到的是功能,而不是bug。解决方案可能是在实体外部移动逻辑,它应该只有字段和访问器。