Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在Hibernate中不工作的一对一lazy=“无代理”

在Hibernate中不工作的一对一lazy=“无代理”
EN

Stack Overflow用户
提问于 2015-12-19 00:44:07
回答 1查看 3.7K关注 0票数 2

最近,我维护了一个遗留项目,它使用了hibernate 3.3.2 ga。现在我正在开发一个新的需求库--这个项目,即实现一个连接查询,例如,有一个foo实体和一个bar实体,它们之间的关系是一对一的:

代码语言:javascript
运行
AI代码解释
复制
Foo:
    Integer id; //primary key
    String orderSeq; //unique key
    //others
Bar:
    String orderSeq; //primary key refer Foo's orderSeq 
    //others

Foo.hbm.xml:
<id name="id" type="java.lang.Integer">
    <column name="id" />
    <generator class="identity" />
</id>
<property name="orderSeq" type="java.lang.String">
    <column name="order_seq" length="40" not-null="true" unique="true">
    </column>
</property>
<one-to-one name="bar" class="com.foo.Bar" lazy="no-proxy">
    <formula>order_seq</formula>
</one-to-one>        

Bar.hbm.xml:
<id name="orderSeq" type="java.lang.String">
    <column name="order_seq" length="40">
    </column>
</id>
<one-to-one name="foo" class="com.foo.Foo" property-ref="orderSeq" lazy="no-proxy">
</one-to-one>

参见上面的配置,我显式地设置了lazy="no-proxy",在正式文件中我知道:

Lazy=“no”指定,当首次访问实例变量时,应该延迟获取该属性。

现在,当我执行以下单元测试时:

代码语言:javascript
运行
AI代码解释
复制
@Test
public void test_query_us_order(){
    Query query = session.createQuery("from Foo a where a.orderSeq = '151207173519268'");
    query.list();
}

我只期望执行一条SQL语句(select ... from foo where foo0_.order_seq = 151207173519268),但实际上还有两条SQL语句,例如:

代码语言:javascript
运行
AI代码解释
复制
select ...
from
    bar bar0_ 
left outer join
    foo foo1_ 
        on bar0_.order_seq=foo1_.order_seq 
left outer join
    bar bar2_ 
        on foo1_.order_seq=bar2_.order_seq 
where
    bar0_.order_seq=?

select ... 
from
    foo foo0_ 
left outer join
    bar bar1_ 
        on foo0_.order_seq=bar1_.order_seq 
left outer join
    foo bar2_ 
        on bar1_.order_seq=bar2_.order_seq 
where
    foo0_.order_seq=?

为什么是这样?为什么lazy="no-proxy"配置不能工作?

EN

回答 1

Stack Overflow用户

发布于 2015-12-21 10:33:38

您在问题中引用的文档对lazy的定义是:

lazy (可选-默认为proxy):默认情况下,单点关联被代理。lazy="no-proxy"指定,当首次访问实例变量时,应该延迟获取该属性。,它需要构建时字节码的检测。 lazy="false"指定关联将总是被急切地获取。

注意no-proxy需要字节码检测的句子。这是因为没有它,Hibernate将不知道何时访问应用程序中的属性。通过修改应用程序生成的字节码,您基本上注入了在访问属性时执行延迟加载的代码。

如果您不使用字节码插装,您应该简单地使用代理来延迟加载,这意味着您应该将关联定义为:

代码语言:javascript
运行
AI代码解释
复制
lazy="proxy"
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34368895

复制
相关文章
Hibernate延迟加载 lazy loading
/**  *  * @author XHW  *  * @date 2011-7-18  *  */ public class HibernateTest {  public static void main(String[] args) {   new HibernateTest().update();  }  public void update(){   Session session=HibernateSessionFactoryUtil.getSessionFactory().getCurrentSession();   session.beginTransaction();  Category category=(Category)session.get(Category.class, 1);   System.out.println("id:"+category.getId()+"  ,name:"+category.getName()+", description:"+category.getDescription());   Set<Product> products=category.getProducts();   session.getTransaction().commit();    } }
Hongten
2018/09/18
1.1K0
hibernate的工作原理
可以实现id自动增加,也就是说,如果往数据库中插入一个name,那么id就自动加1。
qubianzhong
2018/08/10
4190
servlet的工作原理_hibernate工作原理
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
全栈程序员站长
2022/11/09
1.4K0
servlet的工作原理_hibernate工作原理
Hibernate工作原理
Hibernate的优点 1. 对JDBC访问数据库的代码做了封装,大大简化了数据访问层繁琐的重复性代码。  2. Hibernate是一个基于JDBC的主流持久化框架,是一个优秀的ORM实现。他很大程度的简化DAO层的编码工作  3. hibernate使用Java反射机制,而不是字节码增强程序来实现透明性。  4. hibernate的性能非常好,因为它是个轻量级框架。映射的灵活性很出色。它支持各种关系数据库,从一对一到多对多的各种复杂关系。 
week
2018/08/27
6530
如何获取hibernate代理类代理的实际对象实例?
在hibernate中,通过sql语句查询带clob字段的记录,查出来的结果集是List<HashMap<String,Object>>类型,在调用jackson的接口转为json字符串的时候,会报异常,为了解决该问题,尝试在转json之前,先将clob字段找出,然后手动转成string。但是在找出clob字段的过程中,发现List<HashMap<String,Object>>中,clob字段的类型尽然不是Clob,而是一种类似$+数字的东东,原因是hibernate使用了自己的实例代理了该字段,获取真实实例的方法如下:
程序员一一涤生
2019/09/10
2.1K0
hibernate persist update 方法没有正常工作(不保存数据,不更新数据)
在工程中通过spring aop的方式配置事务,使用hibernate做持久化。在代码实现中使用hibernate persit()方法插入数据到数据库,使用hibernate update()方法更新数据。问题是执行这两个方法没有报错,但是也没有插入数据或者更新数据。
用户3148308
2018/09/13
2.4K0
hibernate persist update 方法没有正常工作(不保存数据,不更新数据)
hibernate笔记(三)
当调用session的save/saveOrUpdate/get/load/list等方法的时候,对象就是持久化状态。
HUC思梦
2020/09/03
6310
hibernate和mybatis的区别及特点_hibernate配置文件中,不包含下面的
很长一段时间,网上有很多关于Hibernate与Mybatis孰优孰劣的争论,两个阵营的人谁也不能说服谁,每个人的理由都很有道理。今天,我分享的主题是:在一个项目中同时使用Hibernate和Mybatis两个ORM框架。
全栈程序员站长
2022/10/03
1.7K0
hibernate和mybatis的区别及特点_hibernate配置文件中,不包含下面的
使用 Spring 中的 @Lazy 注解
只有一个参数,默认是true,也就是说只要加了这个注解就会延迟加载。 @Lazy注解则必须在第一次调用的时候才会加载。 @Lazy注解注解的作用主要是减少springIOC容器启动的加载时间。
一个会写诗的程序员
2021/03/02
2K0
轻松学,Java 中的代理模式及动态代理【面试+工作】
代理是英文 Proxy 翻译过来的。我们在生活中见到过的代理,大概最常见的就是朋友圈中卖面膜的同学了。
Java帮帮
2018/10/24
1.1K0
轻松学,Java 中的代理模式及动态代理【面试+工作】
在 NPM 中设置代理
要在 NPM 中设置代理,您需要使用 `npm config set proxy` 命令。以下是一个详细的教程:
用户614136809
2023/10/17
2.5K0
hibernate延迟加载详解
hibernate延迟加载详解 Hibernae 的延迟加载是一个非常常用的技术,实体的集合属性默认会被延迟加载,实体所关联的实体默认也会被延迟加载。hibernate 通过这种延迟加载来降低系统的内存开销,从而保证 Hibernate 的运行性能。 下面先来剖析 Hibernate 延迟加载的“秘密”。 集合属性的延迟加载 当 Hibernate 从数据库中初始化某个持久化实体时,该实体的集合属性是否随持久化类一起初始化呢?如果集合属性里包含十万,甚至百万的记录,在初始化持久化实体的同时,完成所有集合属性
Java帮帮
2018/03/19
1.4K0
hibernate延迟加载详解
动态代理在Android中的运用
动态代理是一种在编程中非常有用的设计模式,它允许你在运行时创建一个代理对象来代替原始对象,以便在方法调用前后执行额外的逻辑。在Android开发中,动态代理可以用于各种用例,如性能监控、AOP(面向切面编程)和事件处理。本文将深入探讨Android动态代理的原理、用途和实际示例。
Rouse
2023/09/12
1.2K0
动态代理在Android中的运用
用户代理在爬虫中的应用
用户代理对应的英文名称为User-Agent, 简称UA. 其具体内容为一行字符串,用来表征操作系统,浏览器版本等信息,以谷歌浏览器为例,通过快捷键F12的调试模式,可以看到浏览器在发送HTTP请求时的头文件,截图如下
生信修炼手册
2020/11/02
1.6K0
用户代理在爬虫中的应用
Hibernate基于主键映射的一对一关联关系
Hibernate是一种流行的对象关系映射(ORM)框架,它为开发人员提供了一种简单而高效的方式来映射Java对象到关系型数据库。在Hibernate中,一对一关联关系的映射可以使用主键映射的方式来实现。
堕落飞鸟
2023/05/16
7450
无协作,不原型!
Mockplus3.1新增了团队协作功能,支持一键创建团队项目、团队成员快捷管理、一键通知成员审阅、多人评论批注的功能。Mockplus是一个简单快速的原型设计工具,对于需要协作的项目,可允许多个团队
奔跑的小鹿
2018/03/16
1.2K0
无协作,不原型!
React中Suspense和lazy的使用
何时使用lazy函数,比如某个体积相对比较大的第三方库或插件(比如JS版的PDF预览库)只在单页应用(SPA)的某一个不是首页的页面使用了,这种情况就可以考虑代码分割,增加首屏的加载速度。
挥刀北上
2021/11/01
3.9K0
React中Suspense和lazy的使用
Kotlin中的延迟属性(lazy properties)
lazy() 是接受一个lambda 并返回一个 Lazy <T> 实例的函数,返回的实例可以作为实现延迟属性的委托。也就是说: 第一次调用get() 会执行已传递给 lazy() 的 lambda 表达式并记录结果, 后续调用get() 只是返回记录的结果。
deep_sadness
2018/08/30
3.5K0
PageHelper在SpringBoot的@PostConstruct中不生效
在使用PageHelper的过程中,出现了一个很奇怪的问题,假设在数据库中存放有30条Country记录,我们用下面的方法使用PageHelper进行分页查询,那么我们希望得到的page.size是10。
翎野君
2023/05/12
1.1K0
Hiberante知识点梳理
Hibernate简介 Hibernat是一个ORM(关系映射)框架,对JDBC访问数据库的操作进行了简化,并且将数据库表中的字段和关系映射为对象,简化了对数据库的操作。 2. 使用方法 读取
李家酒馆酒保
2017/12/26
1.5K0

相似问题

JPA/Hibernate FetchType.LAZY不工作

20

FetchType.LAZY不工作- Hibernate &条件

13

hibernate.enable_lazy_load_no_trans不工作

22

Hibernate ManyToOne FetchType.LAZY不工作吗?

34

Hibernate @OneToOne(fetch = FetchType.LAZY)不工作

111
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档