浏览 2642 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (2) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2009-08-25
学习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的确是一个非常优秀的对象关系映射框架。 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |