We are attempting to lazy load an object property HiResImagePrivate defined in the User Logo mapping below as many-to-one.
The class type itself (File) and all sub classes (Image and Document) have been marked lazy="true" and also all properties and methods of these classes have been marked as virtual.
When we load a UserLogo object by id, an additional select query is always fired, which is loading in a huge image file! I have followed the documentation but have no idea why this is not working.
We have tried outer-join=true, outer-join=false, outer-join=auto on the many-to-one mapping, but no joy, any ideas people?
Hibernate version: 1.0.0.1
Mapping documents:
USER LOGO
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.0">
<class name="Logoers.BusinessLogic.UserLogo, Logoers.BusinessLogic" table="dbo.tblUserLogo">
<id name="ID" type="Int32" unsaved-value="0">
<column name="UserLogoID" sql-type="int" not-null="true" unique="true" index="PK_tblUserLogo"/>
<generator class="native" />
</id>
<property name="Name" type="String">
<column name="name" length="200" sql-type="varchar" not-null="true"/>
</property>
<property name="TotalColours" type="Int32">
<column name="totalColours" sql-type="int" not-null="true"/>
</property>
<property name="PmsInfo" type="String">
<column name="pmsInfo" length="50" sql-type="varchar" not-null="false"/>
</property>
<property name="Notes" type="String">
<column name="notes" length="2000" sql-type="varchar" not-null="false"/>
</property>
<property name="IsDisabled" type="Boolean">
<column name="isDisabled" sql-type="bit" not-null="true"/>
</property>
<component name="ChangeLog" class="Logoers.BusinessLogic.ChangeLog, Logoers.BusinessLogic">
<property name="CreatedOn" type="DateTime" column="createdOn" not-null="true" />
<property name="CreatedBy" type="String" column="createdBy" not-null="true" />
<property name="LastUpdatedOn" type="DateTime" column="LastUpdatedOn" not-null="true" />
<property name="LastUpdatedBy" type="String" column="lastUpdatedBy" not-null="true" />
</component>
<many-to-one name="ClientUser" class="Logoers.BusinessLogic.ClientUser, Logoers.BusinessLogic">
<column name="clientUserID" sql-type="int" not-null="true"/>
</many-to-one>
<many-to-one name="HiResImagePrivate" class="Logoers.BusinessLogic.Image, Logoers.BusinessLogic" >
<column name="hiResImageID" sql-type="int" not-null="true"/>
</many-to-one>
<many-to-one name="LoResImagePrivate" class="Logoers.BusinessLogic.Image, Logoers.BusinessLogic">
<column name="loResImageID" sql-type="int" not-null="true"/>
</many-to-one>
</class>
</hibernate-mapping>
FILE CLASS (SUB CLASSES OF IMAGE AND DOCUMENT)
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.0">
<class
name="Logoers.BusinessLogic.File, Logoers.BusinessLogic"
table="dbo.tblFile"
discriminator-value="File" lazy="true">
<id name="ID" type="Int32" unsaved-value="0">
<column name="fileID" sql-type="int" not-null="true" unique="true" index="PK_tblFile"/>
<generator class="native" />
</id>
<discriminator column="fileClassRef" type="string" />
<property name="FileData" type="BinaryBlob">
<column name="fileData" length="2147483647" sql-type="image" not-null="false"/>
</property>
<property name="Name" type="String">
<column name="name" length="200" sql-type="varchar" not-null="true"/>
</property>
<property name="Extension" type="String">
<column name="extension" length="5" sql-type="varchar" not-null="true"/>
</property>
<property name="MimeType" type="String">
<column name="mimeType" length="50" sql-type="varchar" not-null="false"/>
</property>
<property name="Size" type="Int32">
<column name="size" sql-type="int" not-null="false"/>
</property>
<component name="ChangeLog" class="Logoers.BusinessLogic.ChangeLog, Logoers.BusinessLogic">
<property name="CreatedOn" type="DateTime" column="createdOn" not-null="true" />
<property name="CreatedBy" type="String" column="createdBy" not-null="true" />
<property name="LastUpdatedOn" type="DateTime" column="LastUpdatedOn" not-null="true" />
<property name="LastUpdatedBy" type="String" column="lastUpdatedBy" not-null="true" />
</component>
<subclass name="Logoers.BusinessLogic.Image, Logoers.BusinessLogic" discriminator-value="Image" lazy="true">
<property name="Height" type="Int32">
<column name="image_Height" sql-type="int" not-null="false"/>
</property>
<property name="Width" type="Int32">
<column name="image_Width" sql-type="int" not-null="false"/>
</property>
</subclass>
<subclass name="Logoers.BusinessLogic.Document, Logoers.BusinessLogic" discriminator-value="Document" lazy="true">
</subclass>
</class>
</hibernate-mapping>
Code between sessionFactory.openSession() and session.close():
We use this method for loading all objects by their id:
public static object Load(Type toLoadType, object objectID)
{
try
{
return GetSession().Load(toLoadType, objectID);
}
catch (Exception ex)
{
throw new Exception("NHibernate Load Failure: " + ex.Message, ex);
}
}
Name and version of the database you are using:
SQL Server 2005
The generated SQL (show_sql=true):
INITIAL SELECT
exec sp_executesql N'SELECT userlogo0_.UserLogoID as UserLogoID4_, userlogo0_.totalColours as totalCol3_4_, userlogo0_.isDisabled as isDisabled4_,
userlogo0_.createdOn as createdOn4_, userlogo0_.createdBy as createdBy4_, userlogo0_.LastUpdatedOn as LastUpda9_4_, userlogo0_.lastUpdatedBy as lastUpd10_4_,
userlogo0_.pmsInfo as pmsInfo4_, userlogo0_.loResImageID as loResIm13_4_, userlogo0_.name as name4_, userlogo0_.clientUserID as clientU11_4_, userlogo0_.notes
as notes4_, userlogo0_.hiResImageID as hiResIm12_4_, image1_.fileID as fileID0_, image1_.name as name0_, image1_.createdOn as createdOn0_, image1_.createdBy as
createdBy0_, image1_.LastUpdatedOn as LastUpd10_0_, image1_.lastUpdatedBy as lastUpd11_0_, image1_.mimeType as mimeType0_, image1_.fileData as fileData0_,
image1_.extension as extension0_, clientuser2_.userID as userID1_, clientuser2_.clientUser_clientCompanyID as clientU17_1_, clientuser2_.primaryUserAddressID as
primary16_1_, clientuser2_.isDisabled as isDisabled1_, clientuser2_.title as title1_, clientuser2_.lastName as lastName1_, clientuser2_.membershipUserID as
membersh3_1_, clientuser2_.receiveNewsletter as receive10_1_, clientuser2_.firstName as firstName1_, clientuser2_.fax as fax1_, clientuser2_.phone as phone1_,
clientuser2_.createdOn as createdOn1_, clientuser2_.createdBy as createdBy1_, clientuser2_.LastUpdatedOn as LastUpd14_1_, clientuser2_.lastUpdatedBy as
lastUpd15_1_, clientuser2_.mobile as mobile1_, client3_.companyID as companyID2_, client3_.client_isAccountHolder as client_16_2_, client3_.client_isCorporation
as client_15_2_, client3_.client_franchiseCompanyID as client_19_2_, client3_.client_corporationClientCompanyID as client_18_2_,
client3_.client_primaryClientUserID as client_17_2_, client3_.client_logoerUserID as client_20_2_, client3_.registrationNumber as registra4_2_, client3_.name as
name2_, client3_.taxRegistrationNumber as taxRegis5_2_, client3_.isDisabled as isDisabled2_, client3_.createdOn as createdOn2_, client3_.createdBy as
createdBy2_, client3_.LastUpdatedOn as LastUpda9_2_, client3_.lastUpdatedBy as lastUpd10_2_, client3_.primaryCompanyAddressID as primary14_2_,
client3_.publishingStatusClassifierID as publish11_2_, client3_.publishingAssignedToUserID as publish12_2_, client3_.publishingComments as publish13_2_,
useraddres4_.addressID as addressID3_, useraddres4_.userAddress_userID as userAdd21_3_, useraddres4_.contactMobile as contact11_3_, useraddres4_.state as
state3_, useraddres4_.countryClassifierID as country19_3_, useraddres4_.locality as locality3_, useraddres4_.address1 as address13_, useraddres4_.createdOn as
createdOn3_, useraddres4_.createdBy as createdBy3_, useraddres4_.LastUpdatedOn as LastUpd17_3_, useraddres4_.lastUpdatedBy as lastUpd18_3_,
useraddres4_.address3 as address33_, useraddres4_.address2 as address23_, useraddres4_.contactFax as contactFax3_, useraddres4_.isDisabled as isDisabled3_,
useraddres4_.postCode as postCode3_, useraddres4_.contactPhone as contact10_3_, useraddres4_.contactEmail as contact12_3_, useraddres4_.contactName as
contactN9_3_, useraddres4_.addressTypeClassifierID as address20_3_ FROM dbo.tblUserLogo userlogo0_ left outer join dbo.tblFile image1_ on
userlogo0_.loResImageID=image1_.fileID left outer join dbo.tblUser clientuser2_ on userlogo0_.clientUserID=clientuser2_.userID left outer join dbo.tblCompany
client3_ on clientuser2_.clientUser_clientCompanyID=client3_.companyID left outer join dbo.tblAddress useraddres4_ on
clientuser2_.primaryUserAddressID=useraddres4_.addressID WHERE userlogo0_.UserLogoID=@p0',N'@p0 int',@p0=1
ADDITIONAL SELECT FOR HiResImagePrivate
exec sp_executesql N'SELECT image0_.fileID as fileID0_, image0_.name as name0_, image0_.createdOn as createdOn0_, image0_.createdBy as createdBy0_,
image0_.LastUpdatedOn as LastUpd10_0_, image0_.lastUpdatedBy as lastUpd11_0_, image0_.mimeType as mimeType0_, image0_.fileData as fileData0_, image0_.extension
as extension0_ FROM dbo.tblFile image0_ WHERE image0_.fileID=@p0 and image0_.fileClassRef=''Image''',N'@p0 int',@p0=33
|