http://developer.51cto.com/art/200906/130045.htm
网上流传的很老的一段文字:
红框标记的文字使用hibernate 源码来解释:
hibernate-3.6.0.final/core/src/main/java/org/hibernate/loader/Loader.java
请查看代码Loader.java 1341行代码:
/***
* Resolve any IDs for currently loaded objects, duplications within the
* <tt>ResultSet</tt>, etc. Instantiate empty objects to be initialized from the
* <tt>ResultSet</tt>. Return an array of objects (a row of results) and an
* array of booleans (by side-effect) that determine whether the corresponding
* object should be initialized.
*/
private Object[] getRow(
final ResultSet rs,
final Loadable[] persisters,
final EntityKey[] keys,
final Object optionalObject,
final EntityKey optionalObjectKey,
final LockMode[] lockModes,
final List hydratedObjects,
final SessionImplementor session)
throws HibernateException, SQLException {
final int cols = persisters.length;
final EntityAliases[] descriptors = getEntityAliases();
if ( log.isDebugEnabled() ) {
log.debug(
"result row: " +
StringHelper.toString( keys )
);
}
final Object[] rowResults = new Object[cols];
for ( int i = 0; i < cols; i++ ) {
Object object = null;
EntityKey key = keys[i];
if ( keys[i] == null ) {
//do nothing
}
else {//如果对象已经加载,则直接从session缓存中获取
//If the object is already loaded, return the loaded one
object = session.getEntityUsingInterceptor( key );
if ( object != null ) {
//its already loaded so don't need to hydrate it
instanceAlreadyLoaded(
rs,
i,
persisters[i],
key,
object,
lockModes[i],
session
);
}
else {//没有直接从数据库查询
object = instanceNotYetLoaded(
rs,
i,
persisters[i],
descriptors[i].getRowIdAlias(),
key,
lockModes[i],
optionalObjectKey,
optionalObject,
hydratedObjects,
session
);
}
}
rowResults[i] = object;
}
return rowResults;
}
举个例:
账户对象:Account.java
public class Account{
private Long Id;
private Long balance;
}
两个方法:
//通过用户编号查询用户
getAccountById();
//DML操作更新账户余额
updateAccountBalance();
session.createQuery("update Account a set a.balance=? where a.id = ?").setParameter(0, -100).setParameter(1, 1)
.executeUpdate();
在AccountService中同一个事务中执行如下操作:
场景1
(1) Account account = getAccountById(1);
//更新编号1的余额
(2) updateAccountBalance();
//再次查询
(3)account = getAccountById(1);
此时account对象的余额是没有改变的,因为结果来自session缓存
如果将Hibernate 中设置show_sql = true ,
(1)和(3)都会输入查询SQL,需注意是(3)虽然输出了SQL但数据并不是来自数据库。
场景2
//更新编号1的余额
updateAccountBalance();
//再次查询
Account account = getAccountById(1);
此时account对象的余额是更新后的,因为结果来源数据库
- 大小: 12.3 KB
分享到:
相关推荐
这部分可能包含了使用Hibernate执行DML操作的示例。 7. **013_Struts_Hibernate**: Struts是一个流行的MVC框架,结合Hibernate可以构建强大的Web应用程序。这部分可能展示了如何整合Struts和Hibernate,实现业务...
Hibernate支持通过一次数据库操作插入多条记录。 ##### 4.2 批量更新 批量更新同样可以提高更新操作的效率。 ##### 4.3 StatelessSession StatelessSession用于执行简单的读写操作,不会维护持久性上下文。 ###...
13.4. DML(数据操作语言)风格的操作(DML-style operations) 14. HQL: Hibernate查询语言 14.1. 大小写敏感性问题 14.2. from子句 14.3. 关联(Association)与连接(Join) 14.4. join 语法的形式 14.5. select...
- 对于持久对象,对对象的任何修改都会在事务提交时自动同步到数据库,因为 Hibernate 会在适当的时候生成并执行相应的 SQL DML(Insert, Update, Delete)语句。 - 当事务结束或 `Session` 调用了 `close()`、`...
13.4. DML(数据操作语言)风格的操作(DML-style operations) 14. HQL: Hibernate查询语言 14.1. 大小写敏感性问题 14.2. from子句 14.3. 关联(Association)与连接(Join) 14.4. join 语法的形式 14.5. select...
- 自定义SQL:通过SQLInsert、SQLUpdate、SQLDelete等接口自定义DML操作。 九、最佳实践 1. 避免过多的HQL查询,尽可能使用 Criteria API 或 JPA 的 Criteria API。 2. 合理设计实体关系,避免循环引用导致的内存...
13.4. DML(数据操作语言)风格的操作(DML-style operations) 14. HQL: Hibernate查询语言 14.1. 大小写敏感性问题 14.2. from子句 14.3. 关联(Association)与连接(Join) 14.4. join 语法的形式 14.5. select...
6.1 关系数据库按主键区分不同的记录 6.1.1 把主键定义为自动增长标识符类型 6.1.2 从序列(Sequence)中获取自动增长的标识符 6.2 Java语言按内存地址区分不同的对象 6.3 Hibernate用对象标识符(OID)来区分...
在执行大量数据的插入操作时,例如循环100000次来插入100000条记录,Hibernate的Session持有一级缓存,这会导致所有新创建的User实例被缓存在Session级别。如果不适当地管理这些缓存,可能会遇到`...
13.4. DML(数据操作语言)风格的操作(DML-style operations) 14. HQL: Hibernate查询语言 14.1. 大小写敏感性问题 14.2. from子句 14.3. 关联(Association)与连接(Join) 14.4. join 语法的形式 14.5. select...
13.4. DML(数据操作语言)风格的操作(DML-style operations) 14. HQL: Hibernate查询语言 14.1. 大小写敏感性问题 14.2. from子句 14.3. 关联(Association)与连接(Join) 14.4. join 语法的形式 14.5. select子句 14.6...
DML(数据操作语言)风格的操作(DML-style operations) 14. HQL: Hibernate查询语言 14.1. 大小写敏感性问题 14.2. from子句 14.3. 关联(Association)与连接(Join) 14.4. join 语法的形式 14.5. select子句 ...
- **DML 风格操作**:展示如何使用类似 DML 的风格执行批量操作。 #### 十六、HQL:Hibernate 查询语言 - **大小写敏感性**:解释 HQL 是否区分大小写。 - **from 子句**:介绍如何使用 from 子句指定查询的起点。 ...
13.4. DML(数据操作语言)风格的操作(DML-style operations) 14. HQL: Hibernate查询语言 14.1. 大小写敏感性问题 14.2. from子句 14.3. 关联(Association)与连接(Join) 14.4. join 语法的形式 14.5. select...
- **作用**:方便开发者跟踪SQL语句的执行情况,尤其是复杂的事务操作。 #### 三、JDBC相关配置属性 ##### 1. **hibernate.jdbc.fetch_size** - **用途**:设置JDBC的抓取大小。 - **取值**:非零整数值。 - *...
6.1 关系数据库按主键区分不同的记录 6.1.1 把主键定义为自动增长标识符类型 6.1.2 从序列(Sequence)中获取自动增长的标识符 6.2 Java语言按内存地址区分不同的对象 6.3 Hibernate用对象标识符(OID)来区分...
6.1 关系数据库按主键区分不同的记录 6.1.1 把主键定义为自动增长标识符类型 6.1.2 从序列(Sequence)中获取自动增长的标识符 6.2 Java语言按内存地址区分不同的对象 6.3 Hibernate用对象标识符(OID)来区分...
6.1 关系数据库按主键区分不同的记录 6.1.1 把主键定义为自动增长标识符类型 6.1.2 从序列(Sequence)中获取自动增长的标识符 6.2 Java语言按内存地址区分不同的对象 6.3 Hibernate用对象标识符(OID)来区分...
13.4. DML(数据操作语言)风格的操作(DML-style operations) 14. HQL: Hibernate查询语言 14.1. 大小写敏感性问题 14.2. from子句 14.3. 关联(Association)与连接(Join) 14.4. join 语法的形式 14.5. select子句 14.6...
12. ORM(对象关系映射):ORM框架如Hibernate、MyBatis等,允许开发者使用面向对象的方式操作数据库,减少了直接编写SQL的需求,提高了开发效率。 综上所述,"sql.rar_数据库操作"可能包含了一系列用于简化和优化...