关于Hibernate一对一不能延迟加载的总结

方法是:在主控方的<one-to-one>上加constrained=true,在被控方的class上加lazy=true,其实这个方法是可以的

我们都知道,一对一有两种实现方式,主键关联和外键关联

主键关联:就是说两个表的主键是一样的

product(id,name)image(id,name)

其中image的id引用product的id,product是主,image是次

外键关联:就是说是通过一个字段引用另一个表的主键

product(id,name)image(id,name,productid)

                    其中image的productid引用product的id,product是主,image是次

在主键关联时,按如下进行实体映射,是可以实现延迟加载的

关于Hibernate一对一不能延迟加载的总结<hibernate-mapping package="onetoonebypk"> 

<classname="Product1"table="product1">

<idname="id"unsaved-value="null">

<columnname="id"></column>

<generatorclass="uuid.hex"></generator>

</id>

<propertyname="name"column="name"></property>

<one-to-onename="image1"

class="Image1"

cascade="all"

constrained="true"

>

</one-to-one>

</class>

关于Hibernate一对一不能延迟加载的总结</hibernate-mapping>
关于Hibernate一对一不能延迟加载的总结<hibernate-mapping package="onetoonebypk"  > 

<classname="Image1"table="image1"lazy="true">

<idname="id">

<generatorclass="foreign">

<paramname="property">product1</param>

</generator>

</id>

<propertyname="name"column="name"></property>

<one-to-onename="product1"

class="Product1"

cascade="all">

</one-to-one>

</class>

关于Hibernate一对一不能延迟加载的总结</hibernate-mapping>

当使用外键关联是,如果按如下方式编写映射文件,使不能进行延迟加载的

关于Hibernate一对一不能延迟加载的总结<hibernate-mapping package="onetoonebyfk"  > 

<classname="Image"table="image"lazy="true">

<idname="id">

<generatorclass="uuid.hex"/>

</id>

<propertyname="name"column="name"></property>

<many-to-onename="product"

class="Product"

unique="true"

column="productid">

</many-to-one>

</class>

</hibernate-mapping>

<hibernate-mappingpackage="onetoonebyfk">

<classname="Product"table="product">

<idname="id"unsaved-value="null">

<columnname="id"></column>

<generatorclass="uuid.hex"></generator>

</id>

<propertyname="name"column="name"></property>

<one-to-onename="image"

class="Image"

cascade="all"

constrained="true"

property-ref="product"

>

</one-to-one>

</class>

</hibernate-mapping>

关于Hibernate一对一不能延迟加载的总结

为什么呢,我认为是在主方product中,有这样一句话property-ref="product"

这句话的意思是说加外键关联类的属性,如果不指定这个属性,关联类的主键就会被使用

也就是说,如果不制定这个,在查找image时就会使用

select*fromimagewhereimageid==product_id而不是

select * from image where productid==product_id

我们在知道product_id的时候,需要找image中productid等于product_id记录,而不是用image的主键作为比较

去掉propery-def后,倒是可以延迟加载,但在读取product.getImage()方法时会报没有指定id记录的异常,不过这也正常,我们怎么能用image的主键和product_id建立查询条件呢

至于为什么这样,我不是很清楚

总之:我目前的结论是:用主键关联,可以延迟加载,用外键关联,暂时不考虑延迟加载

至于为什么,希望能到大家的帮助

相关推荐