别的先不说 先来上代码
public void testSaveUser(){
Session session=null;
Transaction tx=null;
try{
session=HibernateUtil.getSession();
tx=session.beginTransaction();
User user1=new User();
user1.setId("001");
user1.setUsername("Iam001");
session.save(user1);
user1.setUsername("Iamnot001");
User user2=new User();
user2.setId("007");
user2.setUsername("iam007");
session.save(user2);
tx.commit();
}catch(Exception e){
e.printStackTrace();
tx.rollback();
}finally{
HibernateUtil.colseSession(session);
}
}
这段代码我们的执行产生的sql语句如下(如要执行这段代码 请配置好Hibernate环境 用junit就可以执行):
Hibernate: insert into t_user2 (username, password, createTime, expireTime, id) values (?, ?, ?, ?, ?)
Hibernate: insert into t_user2 (username, password, createTime, expireTime, id) values (?, ?, ?, ?, ?)
Hibernate: update t_user2 set username=?, password=?, createTime=?, expireTime=? where id=?
由此我们可以得出一下结论 :
hibernate 执行sql语句的顺序是insert(save)-->update--->delete
但是如果我们一定要要求在user1更改后 才能将user2添加到数据库 (我们项目中可能会碰到这种需求)那该怎么办?
这个时候session.flush()的作用就显现出来啦
我们可以在user 进行了更改之后 就显示的调用 session.flush()方法
这样这个的问题就可以迎刃而解
分享到:
相关推荐
`Session.flush()`方法是一个关键的操作,它强制Hibernate将内存中的对象状态同步到数据库,确保数据的一致性。这篇博客深入探讨了`Session.flush()`的工作原理和应用场景。 `Session`在Hibernate中主要有以下职责...
它会发送一个SELECT语句到数据库,查询指定对象的最新数据,并刷新Session缓存中的对象。需要注意的是,`refresh()`方法在事务的隔离级别为Read Committed(读已提交)时才能保证效果,这是因为在其他隔离级别下,...
在给定的部分内容中,提到了一个典型的错误场景,其中包含了一个常见的错误操作序列: ```java SessionFactory sf = new Configuration().configure().buildSessionFactory(); Session s = sf.openSession(); Cat ...
根据提供的文件信息,我们可以深入探讨Hibernate中的几个关键概念与操作,包括`Session.flush()`方法的使用、不同主键生成策略下的保存操作等。 ### Hibernate Session.flush() 方法详解 #### 一、基本概念 在...
我们可以设置一个合理的 JDBC 批处理大小,例如 hibernate.jdbc.batch_size 20,然后在一定间隔对 Session 进行 flush() 和 clear()。这样可以避免内存溢出错误,并提高性能。 在批量插入数据时,我们可以使用以下...
这可能是因为在多线程环境中,一个线程正在使用Session时,另一个线程尝试访问或修改Session,导致并发控制问题。此外,不正确的`flush`或事务提交顺序也可能导致该异常。例如: 1. 在事务中,如果先调用了`evict`...
使用Session的createCriteria()或createQuery()方法查询数据,然后调用list()获取结果列表。 ```java List<User> users = session.createCriteria(User.class).list(); for (User u : users) { System.out.println...
在实际使用中,开发者通常会在一个`Session`生命周期内进行一系列操作,然后在适当的时候调用`flush()`方法强制Hibernate同步数据库,最后在事务结束时调用`commit()`来完成事务。这些方法的正确组合使用是实现高效...
在Java开发中,Hibernate是一个流行的ORM(Object-Relational Mapping)框架,它提供了一种将Java对象映射到关系数据库的方法,简化了数据库操作。"java-hibernate持久化"这个主题主要关注如何使用Hibernate来管理对象...
这里首先设置了一个名为`name`的Session属性,然后通过`removeAttribute()`方法将其移除。这种方法适用于仅需要删除特定属性的情况。 2. **使用`invalidate()`方法彻底清除Session** 当需要彻底清除整个Session...
`scroll()`方法返回一个`ScrollableResults`对象,允许我们以游标方式处理结果集,这在处理大量数据时非常有效。同样,我们需要定期调用`flush()`和`clear()`以控制内存使用。例如: ```java Session session = ...
这种方法的问题在于,每次更新都需要执行一个单独的SQL语句,这不仅消耗了过多的网络资源,而且极大地降低了数据库的性能,尤其是在更新大量数据时。 ### 优化批量更新 为了优化批量更新操作,可以采取以下策略: ...
这是因为Hibernate的Session维护了一个一级缓存,用于存储当前会话期间的所有实体对象。当对象数量过大时,会导致内存不足。为了解决这一问题,可以通过以下方式: 1. **定时刷新缓存**:在循环过程中,设定一定的...
这是最直观的方法,即通过循环遍历需要更新的实体集合,对每一个实体进行修改后调用`session.update()`或`session.saveOrUpdate()`方法。例如: ```java Transaction tx = session.beginTransaction(); List...
Session对象就像一个临时的工作区域,用于在应用程序和数据库之间传递信息。当我们在Session上进行操作时,这些操作不会立即反映到数据库中,而是被缓存起来,直到调用`flush()`方法或者事务提交时才会真正执行。 ...
`out.newLine()`插入一个新行,`out.getBufferSize()`和`out.getRemaining()`分别显示缓冲区的大小和剩余空间,`out.isAutoFlush()`检查是否启用了自动刷新,`out.flush()`则强制清空缓冲区并将数据发送到客户端,而...
这是因为 Hibernate 的 Session 有一个一级缓存,会将所有对象存储在内存中。如果不及时清空缓存,内存将会溢出。 解决方法是使用事务和 flush() 方法来清空缓存。例如: ```java Transaction tx = session.begin...
3. **数据查询与更新**:在同一个Session中,我们可以通过Session的`find()`方法查询数据。在示例中,`session.find("from User")`执行了一个HQL(Hibernate Query Language)查询,返回了User表的所有记录。然后,...
对于每一个查询到的Customer对象,增加其年龄并立即调用`flush()`方法同步更新数据库,然后调用`evict()`方法从缓存中移除对象以释放内存。最后提交事务并关闭Session。 然而,这种方法有两个主要缺点。首先,一次...
在Hibernate中,通常通过`Session`对象的方法来实现这一操作。 **代码示例:** ```java public void save(Item item) { // 获取当前会话 Session session = this.getCurrentSession(); // 使用save方法保存对象...