- 浏览: 376023 次
- 来自: 北京
文章分类
- 全部博客 (237)
- XML (6)
- JavaSE (39)
- Junit (1)
- Maven (10)
- JavaScript (12)
- JavaEE (16)
- HTML5 (10)
- java多线程 (8)
- Hibernate (30)
- Java反射 (3)
- Spring (11)
- Struts (1)
- svn (2)
- linux (12)
- 代码实例 (1)
- 设计模式 (1)
- UML (1)
- javassist (1)
- Oracle (3)
- Hibernate异常 (9)
- DWR (6)
- Java泛型 (2)
- SpringMVC (11)
- Dbunit (3)
- github (2)
- Algorithm (1)
- zTree (1)
- jquery (7)
- freemarker (4)
- mysql (5)
- ffmpeg (1)
- 编码 (1)
- lucene (15)
- hadoop (1)
- JVM (1)
- Regular Expressions (5)
- myeclipse (1)
- 爬虫 (7)
- 加密 (3)
- WebService (2)
- Socket (2)
- Windows (1)
最新评论
-
wxpsjm:
好直接
HV000030: No validator could be found for type: java.lang.Integer. -
wxhhbdx:
学习了,对新手来说很不错的教程。
SpringMVC入门 (二) 数值传递 -
xgcai:
正好在学dwr
DWR入门 (二)用户实例
Session session = HibernateUtil.openSession(); Transaction tx = null; tx = session.beginTransaction(); User user=(User) session.get(User.class, 538); System.out.println(user.getId()); tx.commit(); session.close(); System.out.println(user.getName());
Hibernate在使用get方法时,当程序运行到
User user=(User) session.get(User.class, 538);
就会直接提取出User对象,也就是向数据库发送了select语句。
get方法直接获取实例, 不存在代理。
------------------
这时如果把get换成load, 就会报出一个经典的异常。
at org.hibernate.proxy.AbstractLazyInitializer.initialize(AbstractLazyInitializer.java:164)
at org.hibernate.proxy.AbstractLazyInitializer.getImplementation(AbstractLazyInitializer.java:285)
at org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer.invoke(JavassistLazyInitializer.java:185)
at com.lj.zhang.User_$$_javassist_0.getName(User_$$_javassist_0.java)
at com.lj.zhang.HibernateTest5_search2.main(HibernateTest5_search2.java:47)
从上面的异常信息可以看出, hibernate通过javassist生成的代理对象进行了invoke()的调用, 我猜测应该就是这里调用了javassist所生成的对象类的查询方法。
这个生成的对象class的查询方法在运行时是要通过hibernate的一系列的配置对象的,既是SessionImpl, 但是这个东西已经关闭, 所以getImplementation压根无法得到任何Session对象。 抛出异常。
--以上纯属瞎猜,具体如何还待以后看了源码才知道。
=========================分割线===============
在mapping配置文件中, 我们可以取消延迟加载 , 通过lazy=false。
<hibernate-mapping package="com.lj.zhang">
<class name="User" table="test_user" lazy="false">
当配置了lazy=false之后, 这个User对象便会在session.load()被执行时直接被实例化。 (select语句也会被执行)
tx.commit(); session.close(); System.out.println(user.getName()); System.out.println(user.getOrders().iterator().next().getName());
于是user.getName()会被正常执行。
这里要注意的就是第二个System.out.println会报错。
Exception in thread "main" org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: com.lj.zhang.User.orders, could not initialize proxy - no Session
at org.hibernate.collection.internal.AbstractPersistentCollection.throwLazyInitializationException(AbstractPersistentCollection.java:566)
at org.hibernate.collection.internal.AbstractPersistentCollection.withTemporarySessionIfNeeded(AbstractPersistentCollection.java:186)
at org.hibernate.collection.internal.AbstractPersistentCollection.initialize(AbstractPersistentCollection.java:545)
at org.hibernate.collection.internal.AbstractPersistentCollection.read(AbstractPersistentCollection.java:124)
at org.hibernate.collection.internal.PersistentSet.iterator(PersistentSet.java:180)
at com.lj.zhang.HibernateTest5_search2.main(HibernateTest5_search2.java:48)
这个错误我会想当然的认为, Order配置文件里只要也设置lazy=false,问题就会解决。
事实是这个想法很2,
在Order里面设置这个没有任何作用。
因为Order在main程序中并不是通过load获取的, 而是通过级联获取。
所以重点在一对多的主键那里的配置。也就是User.hbm.xml里面的
<set name="orders" cascade="save-update" inverse="true" > <!-- 级联, inverse=true表示由多的一方维持关联关系 --> <!-- key的column告诉hibernate多的一方的foreign key --> <!-- 这里设置为customer_id, 就会在数据库的order表里生成相应的 --> <key column="customer_id"></key> <one-to-many class="com.lj.zhang.Order"/> </set>
在set节点里加入 lazy="false",
问题就解决了。
此时通过debug模式可以看到, 程序在运行到
User user=(User) session.load(User.class, 538);
的时候, 便会向数据库发送两条select查询语句。
Hibernate: select user0_.id as id1_2_0_, user0_.test_name as test2_2_0_, user0_.test_age as test3_2_0_ from test_user user0_ where user0_.id=?
Hibernate: select orders0_.customer_id as customer3_2_1_, orders0_.id as id1_0_1_, orders0_.id as id1_0_0_, orders0_.test_name as test2_0_0_, orders0_.customer_id as customer3_0_0_ from test_order orders0_ where orders0_.customer_id=?
这时User以及与之关联的Order对象便有了。 程序正常运行。
发表评论
-
Connection is read-only. Queries leading to data modification are not allowed。
2014-04-06 21:52 3724<tx:advice id="txAdvic ... -
org.hibernate.HibernateException: No Session found for current thread
2014-04-06 12:37 0今天在maven中整合spring和hibernate,并使用 ... -
select new Topic from ' Mysql 生成SQL语句错误
2014-03-30 22:51 1655Caused by: com.mysql.jdbc.exce ... -
Unable to locate appropriate constructor on class
2014-02-20 00:11 1461org.hibernate.hql.internal.ast. ... -
Hibernate的load和get实际应用区分简单实例
2013-12-18 11:58 872今天在看孔浩的CMS视频时候看到的。 在57 -文章管理06 ... -
自定义OpenSessionInViewer过滤器
2013-12-11 12:12 1056摘自孔浩视频 spring部分-17_spring_SSH整合 ... -
数据库事务 (三)虚读(Phantom Read)
2013-12-01 13:21 0关于各种读 虚读 phantom read: 转自维基 ... -
Hibernate悲观锁
2013-11-30 17:30 0为了防止两个线程同时修改一个数据,造成更新数据丢失,我们可以使 ... -
Hibernate查询HQL实例
2013-11-29 15:56 1293三个实体类对象: public class Team { ... -
QBC与HQL检索
2013-11-28 17:39 0QBC(Query By Criteria) API提供了检索 ... -
Hibernate继承映射
2013-11-28 12:36 648继承映射分为三种情况 1.每个子类一张表 比如说有一个Pers ... -
Hibernate通过Composite-element配置外联表实例 (码)
2013-11-28 11:07 1016摘自圣思园Hibenrate 26. 组件映射深度解析 -37 ... -
Hibernate配置复合主键 composite primary key (二)
2013-11-27 16:41 1446摘自圣思园Hibernate 26.组件映射深度解析 上一篇 ... -
Hibernate配置复合主键 composite primary key (一)
2013-11-27 14:15 2455这篇是关于如何配置Hibernate实现复合主键的映射功能。 ... -
Hibernate通过Comparator接口自定义排序规则
2013-11-25 20:42 2516摘自圣思园 Hibernate25.自定义内存排序器详解及符合 ... -
Hibernate配置Set和List
2013-11-25 10:44 1878========================Set==== ... -
Hibernate的Map配置
2013-11-23 16:21 1296摘自圣思园022.Hibernate映 ... -
Hibernate多对多配置
2013-11-21 22:39 876场景: Student和Course,每一个Student有多 ... -
Hibernate延迟加载案例 (多: 一: 一,附代码)
2013-11-21 17:41 591摘自圣思园Hibernate20.一 ... -
Hibernate一对一配置
2013-11-20 21:49 1040摘自圣思园 19.Hibernate的对象检索策略深度解析.a ...
相关推荐
《Hibernate延迟加载与代理模式解析》 在Java的持久化框架Hibernate中,延迟加载(Lazy Load)是一项重要的优化策略,其核心目标是提高系统性能,减少内存占用,避免不必要的数据库交互。延迟加载允许我们在需要...
Hibernate的延迟加载(Lazy Loading)和懒加载机制(Lazy Initialization)是优化ORM框架性能的重要策略。这个机制的主要目的是提高程序的效率,减少不必要的数据库交互,只在真正需要数据时才去加载它们。以下是对...
集合属性的延迟加载默认是开启的,这意味着在加载 `Person` 实例时,`addresses` 集合不会立即从数据库加载,除非明确请求。 接着,我们看 `Person` 类的映射文件 `Person.hbm.xml`: ```xml <!-- 省略其他部分 --...
以下是对Hibernate简单实例的详细讲解。 1. **Hibernate环境搭建**: 在开始任何操作之前,你需要在项目中引入Hibernate的核心库,包括hibernate-core.jar和其他相关依赖。通常,这些依赖可以通过Maven或Gradle等...
优化包括合理设置缓存策略、避免N+1查询问题、批量操作、延迟加载等。理解并合理运用这些技巧,可以显著提升Hibernate应用的性能。 通过《Hibernate5实例程序》中的代码示例,读者可以亲手实践上述各个知识点,...
在Java的持久化框架Hibernate中,数据访问优化是至关重要的,而抓取策略(Fetch Strategy)和懒加载(Lazy Loading)则是实现这一目标的关键技术。本文将深入探讨这两个概念,并通过具体的案例进行分析。 首先,让...
- **懒加载**: Hibernate允许延迟加载关联的对象,直到真正需要时才加载,以提高性能。 - **级联操作**: 可以设置关联关系的级联属性,使得对父对象的操作会自动影响到子对象。 8. **缓存机制** - Hibernate提供...
10. **性能调优**:了解如何通过批处理、延迟加载、缓存策略等方式提升Hibernate应用的性能。 这个"eclipse项目Hibernate实例"提供了一个实践平台,让你能够亲手操作,加深对Hibernate的理解,并提升Java数据库编程...
8. **懒加载和立即加载**:理解延迟加载的概念,优化对象加载策略。 9. **缓存机制**:第一级缓存和第二级缓存的使用,提高性能。 10. **实体生命周期**:了解Hibernate中实体的瞬时、持久化、托管和脱管状态。 11. ...
对于初学者来说,理解并应用Hibernate可能有些复杂,但通过简单的实例,我们可以快速入门。这个实例将涵盖Hibernate的基础知识,包括注解方式和XML配置方式。 1. **安装与配置** 在开始之前,你需要在项目中添加...
Hibernate延迟加载(Lazy Loading)** 延迟加载是一种优化策略,只在真正需要数据时才执行数据库查询。例如,当实体对象的集合属性未被访问时,Hibernate不会立即加载这些数据,而是等到需要时才加载,减少不必要的...
7. **延迟加载和立即加载**:理解Hibernate的懒加载机制,以及何时使用立即加载。 8. **事务管理**:了解Hibernate的Transaction API,如何在代码中控制事务的开始、提交、回滚。 9. **Spring与Hibernate集成**:...
总结,这个"spring+hibernate代码实例集"涵盖了Spring和Hibernate的集成应用,包括关系映射、事务管理和延迟加载等核心概念。通过实际的代码示例,开发者可以深入理解并掌握这些技术,提升Java后端开发的能力。
- 掌握Hibernate中延迟加载机制的使用。 **实验步骤:** - 设置实体的检索策略为延迟加载,即在真正需要数据时才从数据库中获取。这可以通过配置文件或注解来实现。 #### 实验四:预先抓取 **实验目的:** - ...
**正文** `Hibernate` 是一款强大的Java对象关系映射(ORM)框架,它极大地简化了数据库操作,使得开发者可以通过操作...在实际项目中,还需要结合具体需求,学习更多高级特性,如级联操作、延迟加载、缓存机制等。
在 Hibernate 框架中,延迟加载(Lazy Loading)是一项核心功能,旨在提高应用程序的性能和效率。它允许数据在真正需要时才从数据库加载,而不是在加载实体时一次性加载所有关联数据。这降低了内存消耗,因为不是...
2. **延迟加载(Lazy Loading)**: Hibernate 支持延迟加载机制,只有当真正需要数据时才会从数据库加载,提高了程序性能。 3. **级联操作(Cascading)**: 可以设置对象间的级联操作,如删除一个父对象时,可以...
9. **性能优化**:Hibernate提供了一些性能优化策略,如延迟加载(Lazy Loading)、批处理(Batch Processing)和缓存策略等,帮助我们提高应用程序的运行效率。 10. **实战项目**:在“北软实训jsp(Hibernate框架...
### Hibernate的多对一和一对多操作实例:深入解析与应用 #### 1. 多对一和一对多概念解析 在关系型数据库设计中,多对一和一对多是两种非常基础且重要的关联关系类型。多对一指的是多个实体(如订单)与一个实体...