`
java_mike
  • 浏览: 85286 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

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一对一之唯一外键关联(双向关联)

    本篇主要探讨的是Hibernate中的一对一(OneToOne)关系映射,特别是唯一外键关联(UniDirectional and Bidirectional Association)的情况。我们将深入理解这种关联方式的配置、实现以及它在实际应用中的价值。 1. ...

    hibernate中的 一对一唯一外键双向关联

    1. **懒加载(Lazy Loading)**:默认情况下,Hibernate会立即加载关联的对象,但可以通过设置`fetch`属性为`LAZY`来实现延迟加载。 2. **避免循环引用**:双向关联可能导致无限递归问题,因此在某些情况下可能需要...

    Hibernate一对一主键关联映射(双向关联)

    在Java的持久化框架Hibernate中,一对一...总之,Hibernate的一对一主键关联映射,特别是双向关联,为Java开发提供了方便的数据持久化手段。通过正确理解和运用这些映射机制,可以更高效地管理和操作数据库中的对象。

    Hibernate双向一对一关联映射(注解版)

    通常,我们会指定一方作为“拥有者”(通过`mappedBy`),另一方不声明`mappedBy`,以防止循环引用。 3. **初始化关联对象**:在使用双向一对一关联时,确保在需要时正确初始化并设置双方的引用,否则可能引发空...

    hibernate一对多,多对一,一对多双向关联

    5. **懒加载与急加载:** Hibernate 提供了懒加载(Lazy Loading)和急加载(Eager Loading)机制来控制关联对象的加载时机。懒加载在默认情况下只加载主实体,关联的对象在需要时才加载;而急加载会在查询主实体时...

    Hibernate ORM - 一对一外键关联关系

    1. **一对一外键关联配置**:在Hibernate中,可以通过在映射文件中添加`&lt;one-to-one&gt;`标签或在实体类上使用`@OneToOne`注解来定义一对一关联。关联的外键通常位于被引用的实体(“一对一”关系的“一”端)中。 2. ...

    Hibernate Annotation 基于外键的单向多对一关联

    `@ManyToOne`用于表示多对一的关系,通常应用在“多”的一方,而`@OneToOne`或`@JoinColumn`则用于“一”的一方,用来指定外键的存在。 假设我们有两个类,一个是`Employee`(员工),另一个是`Department`(部门)...

    hibernate关联关系之一对一双向关联

    - 使用懒加载(`fetch=FetchType.LAZY`)可以避免在加载主对象时立即加载关联对象,提高查询效率。 5. **最佳实践**: - 虽然双向关联提供了便利,但过多的双向关联可能导致代码复杂度增加和潜在的并发问题。因此,...

    hibernate一对一关联关系

    - Hibernate提供两种加载关联对象的策略:懒加载(Lazy)和急加载(Eager)。默认情况下,一对一关联是懒加载的,意味着关联的对象不会在初始加载时被加载,而是等到真正需要时才从数据库中获取。如果希望关联对象...

    Hibernate一对多(多对一)双向关联(annotation/xml)

    - **注解配置**:在双向一对多关联中,一方使用`@ManyToOne`,另一方使用`@OneToMany`并设置`mappedBy`属性。对于多对一,一方用`@OneToOne`,另一方用`@OneToOne(mappedBy = "...")`。 - **XML配置**:需要在双方...

    hibernate各种常用关联关系的基本配置

    配置时使用`@OneToMany`注解,可设置`mappedBy`、`fetch`(默认为EAGER,可改为LAZY实现懒加载)和`cascade`(级联操作)等属性。 ```java @Entity public class User { @OneToMany(mappedBy = "user", cascade = ...

    Hibernate一对一关联映射(注解)

    1. **外键约束**:在一对一关联中,通常由一方持有外键,可以是双向关联,也可以是单向关联。 2. **唯一性**:在数据库中,一对一关联的两个表的关联字段必须具有唯一性约束。 3. **性能考虑**:根据业务需求选择...

    Hibernate_Annotation关联映射

    和其它许多批注一样,在多对多关联中很多值是自动生成,党双向多对多关联中没有定义任何物理映射时,Hibernate根据以下规则生成相应的值,关联表名:主表表名+下划线+从表表名,关联到主表的外键名:主表名+下划线+...

    Hibernate关联关系疑问

    在Hibernate中,可以通过@OneToOne注解来定义,可以是外键约束或主键共享,需要配置fetch属性来决定何时加载关联对象,比如LAZY或EAGER。 2. **一对多关联(OneToMany)**:一个实体可以与多个其他实体关联。这通常...

    Hibernate ORM - 一对一连接表关联关系

    6. **外键约束**: 一对一关联通常需要一个外键来维护关联,这个外键可以位于两个表中的任意一个,但通常放在关联依赖的一方。 7. **懒加载与即时加载**: Hibernate支持懒加载和即时加载策略。在一对一关联中,如果...

    hibernate组件之间的关联

    这种关联可以通过 @OneToOne 注解来实现,并且可以配置为外键约束或者无外键约束。外键约束通常通过 @JoinColumn 或 @PrimaryKeyJoinColumn 来指定。 **一对多关联(One-to-Many)** 一对多关联是最常见的关联类型...

    hibernate一对一主键关联(注解版)

    Hibernate默认会在被引用的一方(在这里是Profile)创建外键,但如果需要在引用方(User)创建外键,可以通过`inverse`属性改变,但这通常不推荐,因为主键关联通常由主表(User)驱动。 7. **懒加载与即时加载**...

    hibernate一对一关联映射

    - 为了提高性能,可以使用懒加载(`fetch=FetchType.LAZY`)避免在不需要时加载关联对象。 - 注意避免无限递归,当两个实体互相引用时可能导致无限循环。 7. **实际应用** 一对一关联常用于用户与角色、订单与...

    Hibernate各种数据库关联annotatian和XML的配置集锦

    -懒加载与立即加载:Hibernate提供懒加载机制,通过`lazy="true"`可以使关联对象在实际访问时才加载,提高性能;而`fetch="join"`则表示立即加载关联对象。 - 外键约束:在多对一和一对一关联中,通常由“一”端...

    hibernate的lazy策略forClass

    在Java的持久化框架Hibernate中,懒加载(Lazy Loading)是一种重要的对象关系映射策略,用于提高应用程序的性能。懒加载的基本思想是延迟加载,即当真正需要数据时,才去数据库加载。在这个场景中,我们关注的是...

Global site tag (gtag.js) - Google Analytics