我的映射Employee和Project有问题:例如在Employee映射中,我有“bag”来映射其他表。问题是当我打开Employee窗口时,这需要花费大量时间(10秒)打开Window,如何使映射更好,也更快?也许在 lazy 或在fetch中?。
这是Employee的映射:
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
assembly="AdminProject"
namespace="AdminProject.Business.Entity">
<class name="Employee">
<id name="EmployeeId" type="int">
</id>
<property name="OperatorNum"
generated="always"
update="false"
insert="false"
type="int"/>
<property name="Password" type="string"/>
<property name="Name" type="string"/>
<property name="LastName" type="string"/>
<property name="DateBegin" type="DateTime"/>
<property name="DateEnd" type="DateTime"/>
<property name="Telephone" type="string"/>
<property name="Address" type="string"/>
<many-to-one
name="EmployeeState"
column="EmployeeStateId"
class="EmployeeState"
fetch="join"/>
<bag name="EmployeebyProject" lazy="false">
<key column="EmployeeId"/>
<one-to-many class="EmployeebyProject"/>
</bag>
<bag name="EmployeeComments" lazy="false">
<key column="EmployeeId"/>
<one-to-many class="EmployeeComments"/>
</bag>
</class>
</hibernate-mapping>
谢谢..
答案 0 :(得分:1)
您应该使用SQL Server Profiler来确定从数据库加载的内容。或者,您可以将NHibernate设置为记录SQL。通过这种方式,您可以更轻松地查看导致延迟的原因。很可能是因为急切地加载集合(你的映射有lazy="false"
)。如果是这种情况,您只需将其设置为true(默认值)。
<bag name="EmployeebyProject" lazy="true">
<key column="EmployeeId"/>
<one-to-many class="EmployeebyProject"/>
</bag>
<bag name="EmployeeComments" lazy="true">
<key column="EmployeeId"/>
<one-to-many class="EmployeeComments"/>
</bag>
您的多对一关联也会急切地加载(fetch="join"
)。
一种流行的方法是使所有关联变得懒惰(懒惰默认获取计划)。然后在您确定需要加载关联的地方使用预先加载。但是,这取决于您的会话管理,因为如果会话不再可用,延迟加载将不起作用。这个book中有一个很好的描述获取计划和策略。
答案 1 :(得分:0)
对于您的行李贴图,请删除lazy =“false”。它默认是懒惰的。