当调用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的两个对象呢?
分享到:
相关推荐
这表明`load`方法更加灵活,可以在不立即执行SQL查询的情况下获得实体对象引用,从而优化性能。而`get`方法则会在调用时立即执行SQL查询。 #### 三、示例分析 假设我们有以下代码: ```java TFaq tfag2 = (TFaq) ...
2. session.load():与get()不同,load()方法不会立即执行SQL查询,而是返回一个代理对象,这个代理对象在需要访问实体属性时才会去数据库加载数据,这就是所谓的延迟加载。如果对象不存在,当试图访问其属性时,会...
`Session.get()`和`Session.load()`是Hibernate中用于根据主键ID加载实体对象的两种方法。这两种方法的主要区别在于异常处理和懒加载支持上: - **`Session.get()`**: 当指定的ID不存在时,`get()`方法返回`null`,...
这是为了提高效率,因为在某些情况下,我们可能只是需要一个对象引用,而无需立即加载所有数据。然而,如果试图访问的实体不存在,将会抛出一个`ObjectNotFoundException`异常。 接下来,我们谈谈源码层面的区别。...
首先,`load()` 方法根据 id 加载用户对象,然后修改名字,最后调用 `saveOrUpdate()` 方法保存更改。如果对象尚未持久化,`saveOrUpdate()` 会将其插入数据库;如果已存在,则更新相应记录。 4. **删除数据** ...
3. 查询:通过`session.load()`加载对象,`session.get()`按ID获取,HQL或Criteria API实现复杂查询。 4. 删除:`session.delete()`移除对象。 **六、HQL与Criteria API** 1. HQL:面向对象的查询语言,类似SQL,但...
当使用Session的load()方法加载同一个对象两次时,由于对象的缓存机制,第二次加载会返回第一次加载的对象引用,所以打印结果为true。 7. Hibernate的更新操作 如果对象的属性被修改,Hibernate会在事务提交时...
当执行`session.load()`方法时,如`User user = (User) session.load(User.class, "1");`,Hibernate并不会立即执行数据库查询。返回的对象实际上是目标实体的代理对象,由CGLIB动态生成,其所有属性初始化为`null`...
4. 加载(Load):`Session.Load()`返回一个未初始化的对象,适用于延迟加载。 5. 获取(Get):`Session.Get()`立即从数据库中获取对象。 6. 查询(Query):使用HQL或IQueryOver API执行查询,返回结果集。 六、...
例如,当你需要创建一个关联关系,但实体尚未被保存到数据库时,可以使用`load`方法生成一个对象引用,然后与其他对象建立关联。如果之后尝试访问这个“空”对象,将会抛出`ObjectNotFoundException`。 在实际开发...
get() 直接返回对象,而 load() 返回代理对象,延迟加载实体的属性。 3. 更新(Update):调用 Session 的 update() 或 merge() 方法可将对象的变更同步到数据库。update() 需要对象已在 Session 中,而 merge() ...
3. 确保正确地引用了`System.Web.SessionState`命名空间。 这样,HTTP处理程序就能像ASP.NET页面一样,与用户会话进行交互了。这在需要在不同页面之间保持状态或者在非页面组件中使用会话数据的情况下非常有用。
2. **持久态(Persistent)**:当调用`session.save(c1)`后,对象变为持久态,进入Session缓存,并被赋予数据库ID(`id=c1.getId()`),即使对象引用丢失(`c1=null`),对象在Session缓存中仍然存在。 3. **脱管态...
- `load()`方法用于加载持久化对象,如果同一事务内连续调用load加载相同ID的对象,会返回相同的代理对象,因此示例代码会打印`true`。 7. **对象属性修改**: - 修改对象属性后,只有当事务提交时,Hibernate才...
在Hibernate中,对于同一个主键加载的同一个类的对象,第二次调用`load()`时,会返回第一次加载的对象的引用。因此`c1`和`c2`实际上是同一个对象,所以输出结果为**C) 打印true**。 #### 七、执行update语句的数量 ...
- **Read**: `Session.load()` 或 `Session.get()` 获取已存在实体,`Query.list()` 或 `Criteria.list()` 执行查询返回结果集。 - **Update**: 修改实体后调用 `Session.update()` 或 `Session.saveOrUpdate()` ...
当调用 `Session` 的 `save()` 方法时,对象会被加入到 Session 缓存中,即使对象不再被直接引用,只要 Session 缓存未被清除,该对象仍然存活。Session 缓存的主要功能包括减少数据库访问次数,保持缓存对象与...
- `load(Class theClass, Serializable id)`:返回对象,若未找到则抛出异常,适用于确保对象存在的场景,效率较高。 ### 总结 Hibernate框架在处理一对多关系映射及持久化对象状态管理方面提供了丰富的功能和灵活...
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. 便利的切入...