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的确是一个非常优秀的对象关系映射框架。

你可能感兴趣的:(Hibernate,框架,xml,.net,OO)