`
logicigam
  • 浏览: 32875 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Hibernate集合加载策略问题

阅读更多
最近在做一个Flex项目,后台spring+hibernate+blazeDS,由于blazeDS不支持延迟加载,逼得我非得把延迟加载关掉,由于我用的是注释配置,我就直接在EJB3的@ManyToMany注解里加了fetch=FetchType.EAGER,详细配置如下

User.java

	@ManyToMany(cascade = { CascadeType.PERSIST,   CascadeType.MERGE },fetch=FetchType.EAGER)
	//多对多定义.
	@JoinTable(name = "USERS_ROLES", joinColumns = { @JoinColumn(name = "USER_ID") }, inverseJoinColumns = { @JoinColumn(name = "ROLE_ID") })
	//集合按id排序.
	@OrderBy("id")
	//集合中对象的id的缓存.
	@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
	public Set<Role> getRoles() {
		return roles;
	}



运行之后发现一个奇怪现象,查询出来的结果每个对象都重复了3份儿,到控制台看生成的SQL语句,发现是用的left outer join,
Hibernate: 
    select
        this_.id as id2_2_,
        this_.email as email2_2_,
        this_.login_name as login3_2_2_,
        this_.name as name2_2_,
        this_.password as password2_2_,
        roles2_.user_id as user1_4_,
        role3_.id as role2_4_,
        role3_.id as id1_0_,
        role3_.name as name1_0_,
        auths4_.role_id as role1_5_,
        authority5_.id as authority2_5_,
        authority5_.id as id0_1_,
        authority5_.display_name as display2_0_1_,
        authority5_.name as name0_1_ 
    from
        users this_ 
    left outer join
        users_roles roles2_ 
            on this_.id=roles2_.user_id 
    left outer join
        roles role3_ 
            on roles2_.role_id=role3_.id 
    left outer join
        roles_authorities auths4_ 
            on role3_.id=auths4_.role_id 
    left outer join
        authorities authority5_ 
            on auths4_.authority_id=authority5_.id 
    order by
        role3_.id asc,
        authority5_.id asc


越看越不对,拷到mysql控制台执行结果还是重复~看来干脆就是SQL语句的问题,左外连接没有过滤结果集。查了查Hibernate手册,转而用
@Fetch(FetchMode.SUBSELECT)
@LazyCollection(LazyCollectionOption.FALSE)

代替原来的fetch=FetchType.EAGER,使用子查询加载集合,测试成功,看来Hibernate也有靠不住的时候,谁能告诉我怎么用left outer join得到正确的结果???毕竟用了子查询的话会多发几条SQL语句,还是看着不爽。
分享到:
评论

相关推荐

    hibernate懒加载策略.doc

    综上所述,Hibernate的懒加载策略是通过代理对象和回调机制实现的,旨在按需加载数据,减少不必要的数据库操作,提高系统效率。合理使用懒加载,可以显著优化数据访问性能,但同时也需要考虑其可能带来的问题和挑战...

    Hibernate集合属性的延迟加载.doc

    此外,还可以通过设置 `&lt;set&gt;` 标签的 `fetch` 属性来控制查询策略,比如使用 `fetch="subselect"` 来预加载集合的大小,或者使用 `batch-size` 来批量加载一定数量的关联记录,进一步优化性能。 总的来说,...

    Hibernate 延迟加载剖析与代理模式应用

    在`&lt;set&gt;`元素中,我们通常会设置`lazy="true"`,这告诉Hibernate对这个集合属性使用延迟加载策略。例如,在`Person.hbm.xml`中,`&lt;set&gt;`元素的`lazy`属性设为`true`,表示`addresses`集合将被延迟加载。 在实际...

    hibernate延迟加载解决

    Hibernate 是一款流行的 Java 持久层框架,它支持多种加载策略,包括即时加载和延迟加载。在本文中,我们将重点讨论后者。 ##### 1. 实体对象的延迟加载 **配置方式:** 要在Hibernate中启用实体对象的延迟加载,...

    HIBERNATE检索策略

    HIBERNATE提供了多种抓取策略,包括基于单端代理和集合代理的批量抓取,以及通过`batch_size`属性实现的批量加载策略。下面我们将对这些策略进行详细的阐述。 ### 一、单端代理的批量抓取 #### 1. 默认抓取策略...

    Hibernate集合映射

    **标题:Hibernate集合映射** **正文:** Hibernate作为Java领域中最流行的ORM(对象关系映射)框架之一,它的核心功能之一就是实现Java对象与数据库表之间的映射。集合映射是Hibernate中一个非常关键的概念,它...

    Hibernate集合映射与关联关系

    本主题将深入探讨Hibernate集合映射与关联关系,包括"student与Score的Map集合关系"、"student与class的多对一"以及"一对多映射"的概念。 首先,让我们理解一下Hibernate中的集合映射。在关系型数据库中,一个实体...

    hibernate在集合上的lazy策略

    1. **Hibernate集合映射**:介绍如何在映射文件或注解中配置集合的懒加载,如`@OneToMany(lazy = FetchType.LAZY)`或`&lt;set lazy="true"&gt;`。 2. **Proxy机制**:解释Hibernate如何创建代理对象,以及这个代理对象...

    Hibernate之数据加载方式

    4. **集合加载策略**:对于一对多或多对多的关系,可以设置不同的集合加载策略,如`FetchType.LAZY`和`FetchType.EAGER`。 ### 二、查询方式 - **HQL(Hibernate Query Language)**:Hibernate的专用查询语言,...

    Flex 与 Hibernate 的延迟加载问题

    2. **dpHibernate+BlazeDS**:dpHibernate是一个开源库,旨在使Hibernate与Flex更好地协同工作,但其与Spring的集成存在问题,如文中所述,当DTO包含集合属性时,可能会导致数据丢失。 3. **DTO模式**:创建无延迟...

    Hibernate lazy加载FOR Connection

    FetchType.LAZY和FetchType.EAGER是两种主要的加载策略,前者对应懒加载,后者则是在加载主对象时同时加载关联对象。 总之,Hibernate的懒加载机制对于提高应用程序的性能和优化数据库交互具有重要意义。开发者需要...

    [原]Hibernate集合映射

    Hibernate提供了懒加载和立即加载策略,用于控制集合的加载时机。默认情况下,集合采用懒加载,只有在实际访问时才从数据库加载,以提高性能。如果需要立即加载,可以使用`fetch="join"`属性。 8. **级联操作** ...

    hibernate set 集合映射

    ### Hibernate集合映射基础 1. **集合类型**:Hibernate支持多种集合类型映射,如Set、List、ArrayList、LinkedList、Map等。Set是最常见的集合映射类型,它不允许重复元素,与数据库中的唯一约束相对应。 2. **...

    hibernate延迟加载技术详细解

    本文将详细探讨 Hibernate 的各种延迟加载策略及其应用场景。 #### 二、Fetching 策略 Fetching 策略定义了 Hibernate 在执行查询时如何获取关联的数据。主要有以下几种: 1. **Join Fetching**:这是一种将主表...

    day36 06-Hibernate抓取策略:set集合上的抓取策略

    3. Subselect Fetching:子查询加载策略会在主查询执行后,通过一个子查询来获取关联对象。例如,对于`@OneToMany(mappedBy="parent", fetch=FetchType.SUBSELECT)`,Hibernate会在查询父对象的同时,用子查询获取...

    hibernate map 集合映射

    Hibernate集合映射的基本概念 集合映射是Hibernate中一个核心的概念,它允许我们将数据库表中的多对一(OneToMany)、一对多(ManyToOne)、多对多(ManyToMany)等关系映射到Java对象的集合属性上。通过这种方式...

    Hibernate的延迟加载

    通过上述解析,可以看出Hibernate的延迟加载机制在多个层面提供了一种智能的性能优化策略。无论是对于单个实体还是集合,延迟加载都能确保只有在真正需要时才执行昂贵的数据库操作,极大地提升了数据加载效率和应用...

    Hibernate延迟加载介绍.doc

    Hibernate作为Java领域中的一个强大的对象关系映射框架,提供了许多优化数据库操作的策略,其中之一便是延迟加载(Lazy Loading)。延迟加载机制旨在减少不必要的性能消耗,只在真正需要数据时才执行加载操作。本文...

    Hibernate延迟加载

    `lazy="true"`会在集合被访问时加载,`lazy="false"`会在加载实体时同时加载集合,而`lazy="extra"`提供更智能的加载策略,推荐在实际应用中使用。 4. 单端关联(One-to-one, many-to-one)的延迟加载:`...

    Hibernate延时加载与lazy机制.doc

    Hibernate的延迟加载(Lazy Loading)和懒加载机制(Lazy Initialization)是优化ORM框架性能的重要策略。这个机制的主要目的是提高程序的效率,减少不必要的数据库交互,只在真正需要数据时才去加载它们。以下是对...

Global site tag (gtag.js) - Google Analytics