`

one-to-many的懒加载及原理分析

阅读更多
如果是一对多,多对一,甚至是多对多那效率就差别大了!!如果一对多lazy=”false”或者fetch=”join”会同时查询出所有关联的对象,对数据库和对网络影响将是很大地。(lazy=”false” 采用多条查询语句,比如,一对100:会有可能101条select查询语句;fetch=”join” 会同时访问两个表的)

但是代理对象调用getClass()和getId()方法的时候不会立刻加载,.class和id的信息是随对象的!


domain对象
public class User {
	
	private Integer id;
	private String name;
	private Float wage;
	private Set<Book> bookSet = new HashSet<Book>();


public class Book {
	
	private Integer id;
	private String bookname;
	private User user;


映射文件

<?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="cn.itcast.hibernate.lazyOneToOne">

	<class name="User" table="user" lazy="false">
		<id name="id" unsaved-value="-1">
			<generator class="native" />
		</id>
		<property name="name" />
		<property name="wage"/>
		<set name="bookSet"  lazy="false" fetch="select">
		     <key column="u_id"/>
		     <one-to-many class="Book"/>
		</set>
		
	</class>
</hibernate-mapping>


<?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="cn.itcast.hibernate.lazyOneToOne">

	<class name="Book" table="book">
		<id name="id" unsaved-value="-1">
			<generator class="native" />
		</id>
		<property name="bookname" />

		<many-to-one name="user" column="u_id"/>
		
	</class>
</hibernate-mapping>



测试代码:

User user = (User)session.get(User.class, 1);


此时的sql语句为:
Hibernate: 
    select
        user0_.id as id0_0_,
        user0_.name as name0_0_,
        user0_.wage as wage0_0_ 
    from
        user user0_ 
    where
        user0_.id=?
Hibernate: 
    select
        bookset0_.u_id as u3_1_,
        bookset0_.id as id1_,
        bookset0_.id as id1_0_,
        bookset0_.bookname as bookname1_0_,
        bookset0_.u_id as u3_1_0_ 
    from
        book bookset0_ 
    where
        bookset0_.u_id=?


如果映射文件改为:

<set name="bookSet"  lazy="false" fetch="join">
		     <key column="u_id"/>
		     <one-to-many class="Book"/>
		</set>


sql语句为:

Hibernate: 
    select
        user0_.id as id0_1_,
        user0_.name as name0_1_,
        user0_.wage as wage0_1_,
        bookset1_.u_id as u3_3_,
        bookset1_.id as id3_,
        bookset1_.id as id1_0_,
        bookset1_.bookname as bookname1_0_,
        bookset1_.u_id as u3_1_0_ 
    from
        user user0_ 
    left outer join
        book bookset1_ 
            on user0_.id=bookset1_.u_id 
    where
        user0_.id=?


如果映射文件为:

		<set name="bookSet"  lazy="true">
		     <key column="u_id"/>
		     <one-to-many class="Book"/>
		</set>



只是访问一个表了:
Hibernate: 
    select
        user0_.id as id0_0_,
        user0_.name as name0_0_,
        user0_.wage as wage0_0_ 
    from
        user user0_ 
    where
        user0_.id=?
分享到:
评论

相关推荐

    Hibernate one-to-many / many-to-one关系映射

    "Hibernate one-to-many / many-to-one关系映射"是两个基本的关系类型,用于表示实体间的关联。在这个主题中,我们将深入探讨这两种关系映射的原理、配置和实际应用。 一、一对一(one-to-one)与一对多(one-to-...

    hibernate经典教材从入门到精通(共四篇)

    同时,可能会讲解级联操作、懒加载与立即加载策略、集合映射(例如List、Set、Map等)以及One-to-One、One-to-Many、Many-to-Many等关系映射的实现。 第三篇可能涉及到Hibernate的缓存机制,包括一级缓存和二级缓存...

    Java工程师三大框架面试题.doc

    2. Hibernate中可以通过many-to-one、one-to-many、many-to-many等配置文件实现类之间的关系。 3. Hibernate的工作原理主要包括读取并解析配置文件、读取并解析映射信息、创立SessionFactory、翻开Session、创立事务...

    Hibernate延迟加载原理与实现方法

    - 对于单端关联(`&lt;many-to-one&gt;`, `&lt;one-to-one&gt;`),可以使用`fetch`属性控制加载方式,如`fetch="join"`会在同一SQL语句中使用内连接获取关联数据,`fetch="select"`则使用延迟加载。 - 集合属性上的抓取策略...

    Hibernate教程16_集合映射

    在数据库中,一对多(One-to-Many)和多对多(Many-to-Many)关系非常常见。例如,一个用户可以有多个订单,而一个订单也可以属于多个用户。在Hibernate中,我们使用集合(如List、Set、Map等)来表示这种关系。通过...

    hibernate_reference中文文档.pdf

    - **6.2.5 一对多关联 (One-to-many Associations)**:讲解一对多关联的映射。 - **6.3 高级集合映射 (Advanced collection mappings)** - **6.3.1 有序集合 (Sorted collections)**:解释有序集合的使用方法。 -...

    Java.Persistence.with.Hibernate.pdf

    ORM的具体实现涉及多种映射策略,例如一对一(One-to-One)、一对多(One-to-Many)、多对一(Many-to-One)和多对多(Many-to-Many)。这些策略的选择取决于具体的应用场景和需求。 #### 持久化操作 Hibernate...

    Hibernate开发手册

    - **一对一(One-to-One)**、**一对多(One-to-Many)**、**多对一(Many-to-One)**、**多对多(Many-to-Many)**:不同的关系类型有不同的映射策略。 #### 四、常用配置与注解 - **hibernate.cfg.xml**:...

    三大框架SSH)面试题

    这些关系可以通过配置文件中的`&lt;one-to-one&gt;`、`&lt;one-to-many&gt;`、`&lt;many-to-many&gt;`标签来定义。 **具体步骤:** 1. **一对一关系:** 可以通过`&lt;one-to-one&gt;`标签在配置文件中定义两个类之间的关系,也可以通过注解...

    hibernate源码

    11. **多对一(One-to-Many)、一对多(Many-to-One)、多对多(Many-to-Many)关系映射** Hibernate 支持多种关联关系的映射,如实体之间的引用,通过`@OneToMany`, `@ManyToOne`, `@ManyToMany` 注解来定义。 12...

    hibernate面试题大全

    类间关系的实现主要依赖于配置文件中的关联声明,如`many-to-one`、`one-to-many`、`many-to-many`等,通过这些声明,Hibernate能够正确处理不同类之间的关联关系。 ### Hibernate的缓存机制 Hibernate的缓存分为...

    Hibernate学习源码

    例如,元素用于定义主键,元素表示普通字段,&lt;one-to-one&gt;、&lt;many-to-one&gt;等元素用于处理关联关系。 五、对象持久化 Hibernate提供了一套API,包括Session、Transaction等接口,用于实现对象的持久化操作。Session...

    Java高级工程师面试题

    - **一对多映射 (One-to-Many):** 表示一个实体类对应多个其他实体类。 - **多对多映射 (Many-to-Many):** 表示两个实体类之间是多对多的关系。 **2. Hibernate2 与 Hibernate3 的映射类型差异:** - **Hibernate2...

    hibernate源码的学习

    Hibernate是一个开源的对象关系映射(ORM)框架,它允许开发者使用Java对象来操作数据库,而无需直接编写SQL语句。...通过对"hibernate-one2many"的分析,我们可以深入研究和实践一对一和一对多关联关系的配置和操作。

    hibernate中文官方文档3.6

    - **Mapping one-to-one and one-to-many associations**:一对一和一对多关联的映射方法。 - **自然ID(Natural-ID)**:自然ID的概念及其在Hibernate中的应用。 - **Any**:特殊映射类型,用于处理非标准数据类型...

    cpp-orm:C++ 对象关系映射器(计划中)

    - 一对多(One-to-Many)、多对一(Many-to-One)、多对多(Many-to-Many)关系的映射,使得对象之间的关系可以直接在C++代码中体现。 5. **性能优化** - ORM库可能会包含缓存机制,以减少不必要的数据库访问,...

    sequelize-poc-源码.rar

    通过深入分析`sequelize-poc-源码`,我们可以了解到Sequelize的工作原理、模型定义、数据操作、关联关系、事务处理以及延迟加载等核心功能。理解并熟练掌握这些知识,将有助于我们在实际项目中高效地使用Sequelize,...

    Mybatis多对多关联映射源码

    - **注解方式配置**:使用`@Many`和`@One`注解来声明多对多关系。例如,`@Many(targetField = "students", fetchType = FetchType.LAZY)`表示一个班级有多个学生。 3. **关联映射的实现原理** Mybatis在处理多对...

    hibernate set 集合映射

    &lt;one-to-many class="com.example.Order" /&gt; ``` 或者使用注解: ```java @Entity public class User { @OneToMany(mappedBy = "user", cascade = CascadeType.ALL) @org.hibernate.annotations.OrderBy("id ...

    Hibernate-Projects-PGP

    10. **一对多(One-to-Many)、多对一(Many-to-One)、多对多(Many-to-Many)关系映射**:Hibernate支持各种关联关系的映射,使得对象间的复杂关系可以轻松地在数据库中表达。 这些项目可能涉及上述知识点的实际...

Global site tag (gtag.js) - Google Analytics