Hibernate OneToOne双向关联为什么没有外键的一方不能Lazy加载?

关联关系映射通常情况是比较难配置正确的。我觉得真正要掌握好Hibernate应该用OO思想来思考问题。就是要在配置过程,以实体对象为核心,关联到数据库,这个方向是不能反,非常重要的。

学习Hibernate关联关系映射配置,一般都是从较容易的着手,如:一对一、一对多、多对多。而且在学习过程碰到问题,应该先主动积极思考,通过实验来验证,这样可以很好的帮助我们理解它的原理。我在学习一对一双向关联关系映射遇到了一个问题,就是为什么没有外键的一方不能使用Lazy加载呢?经过一番的实践思考,得出了结果。

因为,首先一对一的双向关联的双方实体都有对方对象的引用。如下例子代码:用户(User)和他的护照(Passport),此时我配置的是外键在 Passport那方。当Hibernate 要加载User对象的时候,从面向对象的角度来观察,Hibernate怎么知道User到底有没有Passport,它不可能把没有说成有,也不可以有但有设置成null。此时,它必定要拿自己的主键到Passport实体对应的表中查询,从而就要发出查询语句,所以Hibernate加载User实体的时候并不能Lazy加载。

User.java(用户实体)

package demo;

public class User {

private Long id;

private String name;

private Passport passport;

// getter setter

}


Passport.java(护照实体)

package demo;

public class Passport {

private Long id;

private String code;

private User user;

// getter setter
}



hibernate配置文件:

User.hbm.xml

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="demo">
<class name="User" table="t_user">
<id name="id">
<generator class="identity" />
</id>
<property name="name" />
<one-to-one name="passport" property-ref="user" />
</class>
</hibernate-mapping>


Passprot.hbm.xml

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="demo">
<class name="Passport" table="t_passport">
<id name="id">
<generator class="native" />
</id>
<property name="code" />
<many-to-one name="user" column="user_id"
unique="true" not-null="true" />
</class>
</hibernate-mapping>


虽然,以上只是一个小小的例子,但从掌握Hibernate的过程我觉得,如果以OO来分析、理解Hibernate其实很有必要。其中的思想可以体会的很深入,从中你会发现Hibernate的确是一个非常优秀的对象关系映射框架。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值