如果保存数据模块只用到了同一个session,完了直接返回,那么只要开启了事务便不会出现(循环插入数据只插入一条的问题)的问题,
而当代码是同一个session执行了一个查询操作,然后继续执行保存操作,如下:
@Override
public List<Loan> fetchRaisingLoan(String loanId) {
String hql = "from Loan loan where loan.status = '" + "raising' ";
if(!loanId.equals("all")){
hql = hql.concat(" and loan.id = '" + loanId + "'");
}
Session session = ht.getSessionFactory().getCurrentSession();
Transaction tx = session.beginTransaction();
List<Loan> list = session.createQuery(hql).list();
tx.commit();
return list;
}
//在controller层执行完以上查询后循环执行以下插入操作
public void saveP2pToTable(CsaiP2pDataPojo csaiP2pDataPojo) {
Session session = ht.getSessionFactory().getCurrentSession();
Transaction tx = null;
try {
tx = session.beginTransaction();
session.saveOrUpdate(csaiP2pDataPojo);
} catch (Exception e) {
e.printStackTrace();
tx.rollback();
}finally{
tx.commit();
session.close();
}
//session.setFlushMode(FlushMode.AUTO);
}
//之后会出现只插入一条数据的问题
//解决办法:将保存方法中的获取session的方法改为“openSession”即可
//原因:因为二级缓存中保存了第一次的pojo导致,当opensession时重新打开一个session,
//这样,hibernate会认为这缓存中的pojo和新插入的不是同一个,
分享到:
相关推荐
1. **定时刷新缓存**:在循环过程中,设定一定的阈值(如每20条记录),当达到该阈值时,使用`session.flush()`将缓存中的数据写入数据库,并使用`session.clear()`清空缓存,以释放内存空间。 ```java for (int...
- **定期flush和clear**:在循环插入过程中,每达到一定数量(如每20条记录),调用`session.flush()`和`session.clear()`方法,强制Hibernate将当前事务中的变更同步至数据库,并清空session缓存,避免内存占用过高...
2. 插入一条空的Blob记录,这会创建Blob的游标: ```java PreparedStatement pstmt = conn.prepareStatement("insert into javatest(name,content) values(?,empty_blob())"); pstmt.setString(1,"fankai"); pstmt....
程序员需要编写SQL语句来插入数据,或者使用ORM(对象关系映射)框架如Hibernate,它可以简化数据库操作。 7. **数据持久化**:将数据从内存中保存到持久化存储(如数据库)的过程,是软件开发中的重要概念。这里...
在执行大量数据的插入操作时,例如循环100000次来插入100000条记录,Hibernate的Session持有一级缓存,这会导致所有新创建的User实例被缓存在Session级别。如果不适当地管理这些缓存,可能会遇到`...
在Oracle中创建一个序列(sequence)非常简单,只需要执行一条SQL语句即可。例如,为`DEPARTMENT`表创建一个名为`DEPARTMENT_ID_SEQ`的序列,其最小值设为10000,最大值设为极大的数字,增量为1,并且不循环: ```sql...
该表至少需要有一条记录,否则会导致错误。这种策略同样可以跨数据库使用。 在配置文件中,可以通过以下方式指定 hilo 策略: ```xml <param name="table">hibernate_hilo <param name="column">next_hi ...
本文将深入探讨如何使用Hibernate进行批量插入、更新以及查询优化,并介绍相关配置和接口使用。 首先,批量插入是提高数据导入性能的关键。在示例代码中,我们看到通过循环创建并保存Customer对象,然后提交事务。...
这种方式能够将多条 SQL 语句合并为一条,从而减少了数据库访问次数,提高了效率。 3. **避免循环引用导致的问题**:当缓存中的持久化对象之间存在循环引用时,`Session` 会通过特殊的算法避免出现访问对象图的死...
批量更新通常使用HQL(Hibernate Query Language)来完成,通过编写更新语句并执行,可以一次更新多条数据。 【HQL(Hibernate Query Language)】 HQL是面向对象的查询语言,类似于SQL,但它操作的是类、实例和...
- 批量插入:通过`HibernateSession.saveOrUpdateAll()`批量处理多条记录,减少数据库交互次数。 - 批量检索:使用`setFetchSize()`设置批处理大小,减少网络传输和数据库处理压力。 5. **缓存策略**:了解和选择...
主键是表中的一个或多个字段组合,用于唯一标识表中的每一条记录。Hibernate 支持多种主键生成策略,包括 `assigned`、`increment`、`hilo` 和 `seqhilo` 等,这些策略具有不同的特性和适用场景。 #### 二、主键...
- **数据规模**: 一千条数据批量提交 ### 第一种方式:对象集合接收 **Action中对象集合定义**: ```java private List<User> userList; // 构造get和set方法 ``` **JSP页面属性定义**: ```html <td><input name=...
使用`<foreach>`标签,遍历集合并在插入语句中生成多个值对,例如在示例中,循环遍历roleIdList并插入数据。 b. 利用ExecutorType.BATCH执行器,创建SqlSession时指定ExecutorType为BATCH,这样可以将多条SQL语句...
此外,为了优化性能,还可以考虑批量插入,即一次性提交多条SQL语句,而不是每次插入一条。 最后,为了确保程序的健壮性,还需要处理可能出现的异常,比如XML解析错误、数据库连接问题等。使用try-catch语句块捕获...
- 使用`<foreach>`标签:在XML映射文件中,利用`<foreach>`循环插入多条数据。 - 利用`ExecutorType.BATCH`:创建一个配置为批量操作的SqlSession,对每个对象调用insert方法,最后提交事务。 5. Session机制: ...
在处理大量数据时,一次性加载所有记录可能导致性能问题。因此,通常会采用分页来只加载用户需要的部分数据。以下是一个简单的Java分页实现示例: 1. 首先,确定每页显示的记录数(如10条)和当前页码。 2. 计算...
在Java的JDBC(Java Database Connectivity)中,一对多查询是指一个表中的记录与另一个表中的多条记录之间存在关联关系。在这个例子中,我们看到的是"Grades"(年级)与"Students"(学生)之间的关系,一个年级可以...
它将数据分为多个部分(页),每次只加载一部分,而不是一次性加载所有数据,从而减少服务器负载和用户等待时间。分页主要涉及到以下几个关键点: 1. **分页参数**:通常包括当前页码(Page Number)和每页显示条数...