最近喜欢上了nhiberniate,虽然自己原本不是属于.net平台的开发人员。不过也接触过最近由于业务原因要开始.net的开发。虽然是给内部做点东西,所以可选择余地很大。。。
但是负责的将自己.net了解不多。。。于是乎看到了nhibernate架构。。不过这个架构也折腾了我很久。。因为的确速度有些慢。不过封装的很好。一点一点接触我又发现他对于多表查询貌似和hibernate,spring等有很多类似的地方。。。。不是很方便。不过我想既然都更新了这么多次版本应该有好的方法。。。
于是乎请教liyongji~~~哈哈博客园名人。。。
经过指点和实验,知道了nhibernate的一个应用就是idbag。这个在hibernate上面也应该有的,只是大家都不太清楚吧?
B
id subid name
01 01 A1
01 02 A2
01 03 A3
A
id name
01 A
查询后
A 01 A1
A 02 A2
A 03 A3
我们的sql 可以是select name =(select name from A where id = a.id),id,name from B a
但是这对于nhibernate来讲可能就很麻烦了,因为这些架构应该都对于单表查询有很好的支持,多表类似上面的就有些问题。
看了很多资料都在说通过新建一个类实体来映射查询后的字段。。。不过这样的话不久违反了架构的本意么?
因此我觉得应该有这样的应用。
并且nhibernate源码也提供了这个测试用例。大家可以在test collectiontest文件夹内找到。
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="nhibernateTest2" namespace="NHibernate.Test.CollectionTest">
<class name="A" table="a" lazy="false">
<id name="Id" column="id" unsaved-value="null">
<generator class="native" />
</id>
<property name="Name" column="aname" />
<idbag name="Items" cascade="all-delete-orphan">
<collection-id type="Int32" column="item_id">
<generator class="increment" />
</collection-id>
<key column="a_id" />
<element type="string" />
</idbag>
</class>
</hibernate-mapping>
对于他的实体类的定义如下
using System;
using System.Collections;
namespace NHibernate.Test.CollectionTest
{
public class A
{
private int? _id;
private string _name;
private IList _items;----------------------定义了iList用来做什么呢?下面解答。
public A() { }
public int? Id
{
get { return _id; }
set { _id = value; }
}
public string Name
{
get { return _name; }
set { _name = value; }
}
public IList Items
{
get { return _items; }
set { _items = value; }
}
}
}
经过试验我发现这个地方用来保存外键id对应的sub也就是B表的内容,不过很有意思的是我们的sql语句是从B表查询。但是在这给对方我们却看到我们得到的结果是通过A表来实现的。外键的作用就体现了出来,感觉就像找到了一个节点。。他下面的你都能找到了。。。
恩还可以。。。这就简单实现了多表查询结果的方法。不过我还在思考着会不会有别的问题呢???毕竟我们想从B表查询或者修改。。。他是从A表实现的。
主体就可以执行session. CreateCriteria(typeof(A)).List();就可以得到结果。
便利获取就可以,对于ITEMS这个field我们需要foreach遍历,自己是研究知道他的存储方式了。
顺便说一下,通过咨询和请教突然觉得hbm2dll这个工具很好。。根据实体映射文件反向生成数据库表~~~