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

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

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

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

User.java(用户实体) 
Java代码   收藏代码
  1. package demo;   
  2.   
  3.    public class User {  
  4.   
  5.        private Long id;  
  6.   
  7.         private String name;  
  8.   
  9.         private Passport passport;  
  10.   
  11.         // getter setter  
  12.   
  13.    }  


Passport.java(护照实体) 
Java代码   收藏代码
  1. package demo;  
  2.     
  3.    public class Passport {  
  4.   
  5.        private Long id;  
  6.   
  7.        private String code;  
  8.   
  9.        private User user;  
  10.   
  11.        // getter setter  
  12.    }  



hibernate配置文件: 

User.hbm.xml 
Xml代码   收藏代码
  1. <?xml version="1.0"?>  
  2. <!DOCTYPE hibernate-mapping PUBLIC  
  3. "-//Hibernate/Hibernate Mapping DTD 3.0//EN"  
  4. "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">  
  5. <hibernate-mapping package="demo">  
  6. <class name="User" table="t_user">  
  7. <id name="id">  
  8. <generator class="identity" />  
  9. </id>  
  10. <property name="name" />  
  11. <one-to-one name="passport" property-ref="user" />  
  12. </class>  
  13. </hibernate-mapping>  


Passprot.hbm.xml 
Java代码   收藏代码
  1. <?xml version="1.0"?>  
  2. <!DOCTYPE hibernate-mapping PUBLIC  
  3. "-//Hibernate/Hibernate Mapping DTD 3.0//EN"  
  4. "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">  
  5. <hibernate-mapping package="demo">  
  6. <class name="Passport" table="t_passport">  
  7. <id name="id">  
  8. <generator class="native" />  
  9. </id>  
  10. <property name="code" />  
  11. <many-to-one name="user" column="user_id"  
  12. unique="true" not-null="true" />  
  13. </class>  
  14. </hibernate-mapping>  


虽然,以上只是一个小小的例子,但从掌握Hibernate的过程我觉得,如果以OO来分析、理解Hibernate其实很有必要。其中的思想可以体会的很深入,从中你会发现Hibernate的确是一个非常优秀的对象关系映射框架。

你可能感兴趣的:(Hibernate OneToOne双向关联为什么没有外键的一方不能Lazy加载?)