`
梦里天涯路
  • 浏览: 20641 次
  • 性别: Icon_minigender_1
  • 来自: 昆明
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

session.load()返回对象的引用问题?

阅读更多
当调用session.load()发放返回的实际对象不止一个时应该如何分别取得每个对象的引用?

比如:
     数据库如下:
                  table:Student
                                Sid    Sname    Sgroup
                                 1      yang      5
                                 2       yue      5
                table :Sgroup 
                                 id      name
                                 5       ball
     其中Student表中的Sgroup字段是Group表中的外键
Hibernate:
    select
        group0_.ID as ID1_1_,
        group0_.NAME as NAME1_1_,
        stu1_.SID as SID0_0_,
        stu1_.SGROUP as SGROUP0_0_,
        stu1_.SNAME as SNAME0_0_
    from
        student.dbo.Sgroup  Sgroup0_
    left outer join
        student.dbo.Student Student1_
            on Sgroup0_ .ID=Student1_ .SGROUP
    where
        Sgroup0_.ID=?

而这条语句的结果是:     id      name   Sid    Sname    Sgroup
                     5        ball    1      yang      5
                     5       ball     2       yue      5
但是session.load()方法返回的是一个对象,虽然可以通过转型使其为Sgroup类型,但是在引用其值的时候就会抛出异常,
比如:
         group  =  (Sgroup) session.load(Sgroup.class, 1);
        ...........................
        System.out.println(group.getName());

产生如下异常
            More than one row with the given identifier was found

对于这种情况应该如何引用所返回的两个Sgroup的两个对象呢?
分享到:
评论
3 楼 yfddht1573 2008-05-05  
梦里天涯路 写道


  Sgroup group = (Sgroup) session.load(Sgroup.class, 5);

那就不用返回一个对象

     换成
 
List list = session.load(Sgroup.class, 5); 
然后再foreach出来就OK了... 

2 楼 daimon 2007-08-10  
好久没用Hibernate了,如果直接JDBC的话,那就用游标,将取到的对象放在对象数组中就行了
1 楼 梦里天涯路 2007-08-09  
不好意思,这句打措了:group = (Sgroup) session.load(Sgroup.class, 1);
应该是    group = (Sgroup) session.load(Sgroup.class, 5);
查了些书籍,上面都写着用session.load()方法可以返回一个对象,可是当你表和其他的表关联起来的时候,返回的就不只是一个对象了!如本例!

相关推荐

    session的get与load比较

    这表明`load`方法更加灵活,可以在不立即执行SQL查询的情况下获得实体对象引用,从而优化性能。而`get`方法则会在调用时立即执行SQL查询。 #### 三、示例分析 假设我们有以下代码: ```java TFaq tfag2 = (TFaq) ...

    hibernated的线程同步问题

    2. session.load():与get()不同,load()方法不会立即执行SQL查询,而是返回一个代理对象,这个代理对象在需要访问实体属性时才会去数据库加载数据,这就是所谓的延迟加载。如果对象不存在,当试图访问其属性时,会...

    Hibernate几种获数据方法比较

    `Session.get()`和`Session.load()`是Hibernate中用于根据主键ID加载实体对象的两种方法。这两种方法的主要区别在于异常处理和懒加载支持上: - **`Session.get()`**: 当指定的ID不存在时,`get()`方法返回`null`,...

    Hibernate的get和load方法的区别

    这是为了提高效率,因为在某些情况下,我们可能只是需要一个对象引用,而无需立即加载所有数据。然而,如果试图访问的实体不存在,将会抛出一个`ObjectNotFoundException`异常。 接下来,我们谈谈源码层面的区别。...

    hibernate的用法

    首先,`load()` 方法根据 id 加载用户对象,然后修改名字,最后调用 `saveOrUpdate()` 方法保存更改。如果对象尚未持久化,`saveOrUpdate()` 会将其插入数据库;如果已存在,则更新相应记录。 4. **删除数据** ...

    Hibernate课程的总结

    3. 查询:通过`session.load()`加载对象,`session.get()`按ID获取,HQL或Criteria API实现复杂查询。 4. 删除:`session.delete()`移除对象。 **六、HQL与Criteria API** 1. HQL:面向对象的查询语言,类似SQL,但...

    十五道Hibernate面试题及答案.doc

    当使用Session的load()方法加载同一个对象两次时,由于对象的缓存机制,第二次加载会返回第一次加载的对象引用,所以打印结果为true。 7. Hibernate的更新操作 如果对象的属性被修改,Hibernate会在事务提交时...

    Hibernate的延迟加载

    当执行`session.load()`方法时,如`User user = (User) session.load(User.class, "1");`,Hibernate并不会立即执行数据库查询。返回的对象实际上是目标实体的代理对象,由CGLIB动态生成,其所有属性初始化为`null`...

    NHibernate中文文档

    4. 加载(Load):`Session.Load()`返回一个未初始化的对象,适用于延迟加载。 5. 获取(Get):`Session.Get()`立即从数据库中获取对象。 6. 查询(Query):使用HQL或IQueryOver API执行查询,返回结果集。 六、...

    hibernate中get和load的区别共5页.pdf

    例如,当你需要创建一个关联关系,但实体尚未被保存到数据库时,可以使用`load`方法生成一个对象引用,然后与其他对象建立关联。如果之后尝试访问这个“空”对象,将会抛出`ObjectNotFoundException`。 在实际开发...

    Hiberbate增删改查(分页)的例子简单的

    get() 直接返回对象,而 load() 返回代理对象,延迟加载实体的属性。 3. 更新(Update):调用 Session 的 update() 或 merge() 方法可将对象的变更同步到数据库。update() 需要对象已在 Session 中,而 merge() ...

    利用IRequiresSessionState让handler获取session

    3. 确保正确地引用了`System.Web.SessionState`命名空间。 这样,HTTP处理程序就能像ASP.NET页面一样,与用户会话进行交互了。这在需要在不同页面之间保持状态或者在非页面组件中使用会话数据的情况下非常有用。

    域模型的种状态与hibernate缓存PPT学习教案.pptx

    2. **持久态(Persistent)**:当调用`session.save(c1)`后,对象变为持久态,进入Session缓存,并被赋予数据库ID(`id=c1.getId()`),即使对象引用丢失(`c1=null`),对象在Session缓存中仍然存在。 3. **脱管态...

    精华-Hibernate面试题及答案大集合

    - `load()`方法用于加载持久化对象,如果同一事务内连续调用load加载相同ID的对象,会返回相同的代理对象,因此示例代码会打印`true`。 7. **对象属性修改**: - 修改对象属性后,只有当事务提交时,Hibernate才...

    Hibernate面试题

    在Hibernate中,对于同一个主键加载的同一个类的对象,第二次调用`load()`时,会返回第一次加载的对象的引用。因此`c1`和`c2`实际上是同一个对象,所以输出结果为**C) 打印true**。 #### 七、执行update语句的数量 ...

    hibernate开发指南

    - **Read**: `Session.load()` 或 `Session.get()` 获取已存在实体,`Query.list()` 或 `Criteria.list()` 执行查询返回结果集。 - **Update**: 修改实体后调用 `Session.update()` 或 `Session.saveOrUpdate()` ...

    Hibernate对象持久化状态

    当调用 `Session` 的 `save()` 方法时,对象会被加入到 Session 缓存中,即使对象不再被直接引用,只要 Session 缓存未被清除,该对象仍然存活。Session 缓存的主要功能包括减少数据库访问次数,保持缓存对象与...

    hibernate 学习笔记3

    - `load(Class theClass, Serializable id)`:返回对象,若未找到则抛出异常,适用于确保对象存在的场景,效率较高。 ### 总结 Hibernate框架在处理一对多关系映射及持久化对象状态管理方面提供了丰富的功能和灵活...

    Spring-Reference_zh_CN(Spring中文参考手册)

    6.8.4. 在Spring应用中使用AspectJ Load-time weaving(LTW) 6.9. 其它资源 7. Spring AOP APIs 7.1. 简介 7.2. Spring中的切入点API 7.2.1. 概念 7.2.2. 切入点实施 7.2.3. AspectJ切入点表达式 7.2.4. 便利的切入...

Global site tag (gtag.js) - Google Analytics