其实,对于Hibernate 的 Lazy
可以说是又爱又恨
不过好像细想,爱是自然,恨嘛... 个人觉得还是恨自己的技术不过关吧
Lazy 懒加载 和 Fetch 抓取
是对相反的东西
用好了相当于可以自由切换Hibernate配置中的 lazy = "xxx" 这个属性
情景:
一个 ACL 有很多 Power ,他们是一 (ACL) 对多 (Power) 关系
所有ACL端有
/**
* 权限实体集合
*/
@OneToMany(
fetch=FetchType.LAZY,mappedBy="theAcl",cascade={CascadeType.REMOVE}
)
private Set<Power> powers;
可以看到,上面的Lazy已经是 true ,也就是这个powers会延迟加载
当然,我们可以用抓取fetch把powers强制加载上来
HQL 如下:
from ACL as a inner join fetch a.powers
但是,这样写...加载是加载上来了,但是 ACL 的记录条数重复了
发出的SQL如下:
Hibernate:
select
acl0_.id as id19_0_,
powers1_.id as id24_1_,
acl0_.aclName as aclName19_0_,
powers1_.isApply as isApply24_1_,
powers1_.powerCreate as powerCre3_24_1_,
powers1_.powerDelete as powerDel4_24_1_,
powers1_.powerLoad as powerLoad24_1_,
powers1_.powerName as powerName24_1_,
powers1_.theAcl_id as theAcl8_24_1_,
powers1_.powerUpdate as powerUpd7_24_1_,
powers1_.theAcl_id as theAcl8_0__,
powers1_.id as id0__
from
t_acl acl0_
inner join
t_power powers1_
on acl0_.id=powers1_.theAcl_id
也就是 select 后面,字段上也跟上了 t_power这个表的内容
所以记录会重复...
解决方案就是加上: distinct 关键字
HQL如下:
select distinct a from ACL as a inner join fetch a.powers
也就是让ACL 唯一 (其实就是ACL的主键唯一)
发出SQL如下:
Hibernate:
select
distinct acl0_.id as id19_0_,
powers1_.id as id24_1_,
acl0_.aclName as aclName19_0_,
powers1_.isApply as isApply24_1_,
powers1_.powerCreate as powerCre3_24_1_,
powers1_.powerDelete as powerDel4_24_1_,
powers1_.powerLoad as powerLoad24_1_,
powers1_.powerName as powerName24_1_,
powers1_.theAcl_id as theAcl8_24_1_,
powers1_.powerUpdate as powerUpd7_24_1_,
powers1_.theAcl_id as theAcl8_0__,
powers1_.id as id0__
from
t_acl acl0_
inner join
t_power powers1_
on acl0_.id=powers1_.theAcl_id
成功解决!
PS : 当然我上面用了 inner join fetch,改成left join 更好
分享到:
相关推荐
未来 Hibernate是一个强大的Java持久化框架...以上各点提供了实现这一目标的基础,但实际项目中可能还需要解决更多特定于数据库的问题。通过良好的设计和测试,可以确保Hibernate应用程序在多种数据库环境下稳定运行。
在此背景下,《很不错的Hibernate解决方案》一文介绍了一种基于Hibernate框架的物流系统持久层解决方案,旨在解决当前物流系统中存在的问题,并提升整体性能。 #### Hibernate框架简介 Hibernate是一种开放源代码的...
为了解决这个问题,Hibernate提供了几种抓取策略,包括批量抓取和预加载。 批量抓取允许我们在一次查询中获取多个关联对象,而不是逐个加载。例如,如果我们有一个`User`实体,每个用户都有多个`Order`,我们可以...
在Java的持久化框架Hibernate中,数据访问优化是至关重要的,而抓取策略(Fetch Strategy)和懒加载(Lazy Loading)则是实现这一目标的关键技术。本文将深入探讨这两个概念,并通过具体的案例进行分析。 首先,让...
为了解决这个问题,Hibernate提供了不同的抓取策略。 1. **批处理抓取(Batch Fetching)**:这是一种优化技术,可以一次从数据库获取多个关联的实体。对于set集合,我们可以设置`@Fetch(FetchMode.BATCH)`来指定...
Hibernate封装了很多有用的API给开发者,降低了操作数据库的难度和复杂度,同时也减少了模板代码的数量,但Hibernate留给开发者可操作的空间相对Mybatis少了很多。 Mybatis框架使用起来很灵活,开发者可以自定义查询...
### Hibernate中文问题解决方案 在开发基于Java的应用程序时,Hibernate作为一个强大的对象关系映射(ORM)框架被广泛采用。然而,在处理中文字符时,开发者可能会遇到各种各样的问题,如乱码显示等。本文将详细...
总结起来,这个多数据库解决方案利用Spring的IoC容器管理和配置了多个数据源,同时结合Hibernate提供了ORM功能。通过`OpenSessionInView`模式,确保了Web请求中的持久化操作能在合适的Session上下文中进行。这样的...
### Hibernate常见错误解决方案 在开发基于Hibernate框架的应用程序时,我们经常会遇到各种各样的异常情况。这些异常不仅会影响系统的正常运行,还可能增加调试难度。本文将针对几个常见的Hibernate异常进行详细...
对于更新和删除操作,可以使用`scroll()`方法,这在Hibernate 2.1.6或更高版本中是支持的。`scroll()`方法返回一个`ScrollableResults`对象,允许我们以游标方式处理结果集,这在处理大量数据时非常有效。同样,我们...
为了解决这个问题,我们可以使用预加载(eager loading)或者子集加载(fetch plan)等抓取策略。 在"many-to-one"关系中,一个实体可以与多个其他实体相关联。默认情况下,Hibernate会设置这种关联为懒加载,即...
"Struts+Spring+Hibernate通用分页解决方案"是针对基于这三大框架(Struts、Spring、Hibernate)的Java Web应用所设计的一种高效且可复用的分页策略。以下是关于这个主题的详细解释: 1. **Struts框架**:Struts是...
weblogic10 与hibernate冲突解决方案 错误如下:org.hibernate.QueryException: ClassNotFoundException: org.hibernate.hql.ast.HqlToken linux windows 环境解决方案全解 Linux 启动脚本添加如下: export USER_...
在使用Hibernate进行数据库操作时,有时会遇到一种异常情况,即在尝试删除一个对象时,系统抛出"deleted object would be re-saved by cascade (remove deleted object from associations)"的异常。这个异常通常发生...
在 Hibernate 配置文件中,可以设置 `hibernate.jdbc.batch_size` 参数来指定批量抓取的大小。 如何实现批量更新 在 Controller 层,需要将大量数据插入到数据库时,可以使用以下方法: ```java for (int i = 0; ...
本文将深入探讨在使用Hibernate进行数据库操作时遇到的锁问题,并提供相应的解决方案。 首先,我们要理解数据库中的锁机制。在多用户并发环境中,为了保证数据的一致性和完整性,数据库系统通常会采用不同类型的锁...
### Hibernate 实现动态表查询的多种解决方案 #### 一、前言 在使用Hibernate进行数据库操作时,我们经常需要根据不同的需求对不同的表进行查询。特别是在处理多表、多库等复杂场景时,如何实现动态表查询就显得尤...