save方法

本文介绍了Hibernate框架中Session的save()方法的工作原理及其使用细节,包括如何将临时对象转变为持久化对象,并解释了在不同情况下ID生成策略的影响。

Session的save()方法用来将一个临时对象转变为持久化对象,也就是将一个新的实体保存到数据库中。通过save()将持久化对象保存到数据库需要经过以下步骤:

1,系统根据指定的ID生成策略,为临时对象生成一个唯一的OID;

2,将临时对象加载到缓存中,使之变成持久化对象;

3,提交事务时,清理缓存,利用持久化对象包含的信息生成insert语句,将持久化对象保存到数据库。


OK,下面来看一个实例:

[java]  view plain  copy
  1. //创建SessionFactory  
  2. Configuration config = new Configuration();  
  3. ServiceRegistry  sr = new ServiceRegistryBuilder().applySettings(config.getProperties()).buildServiceRegistry();    
  4. SessionFactory sessionFactory = config.buildSessionFactory(sr);   
  5.   
  6. //打开Session  
  7. Session session = sessionFactory.openSession();  
  8.   
  9. //开启事务  
  10. Transaction tx = session.beginTransaction();  
  11.   
  12. //创建临时对象并赋值  
  13. User user = new User();  
  14. user.setId("1");  
  15. user.setUserName("lsj");  
  16. session.save(user);  
  17.   
  18. //提交事务  
  19. tx.commit();  
  20.   
  21. //关闭Session  
  22. session.close();  

PS:

1,从Hibernate 4之后,Configuration类中,原先常用的,获取SessionFactory的方法buildSessionFactory()被标记为过时,官方建议使用buildSessionFactory(ServiceRegistry sr)这个方法来获取SessionFactory。

2,如果映射文件中为对象的ID指定了生成策略,那么在程序中为其ID赋值是无效的。会被系统自动生成的值覆盖,例如:


映射文件指定ID生成策略由Hibernate控制自增:

[html]  view plain  copy
  1. <id name="id" type="string">  
  2.     <generator class="increment">  
  3. </id>  

然后程序中进行如下操作:

[java]  view plain  copy
  1. user.setId("1");  
  2. System.out.println("手动赋值为:"+user.getId());  
  3. session.save(user);  
  4. System.out.println("存入数据库的值为:"+user.getId());  

这样,最终存入数据库的ID是Hibernate自动生成的自增ID,而不是我们手动给的值。

另外,执行save()方法时并不会将对象存入数据库,在提交事务时,对象才被真正的保存到数据库中。save()方法是将对象保存到Session的缓存中,提交事务时,Hibernate会生成相应的insert语句,将对象保存到数据库。


再跟大家说一点需要注意的地方,Hibernate在提交事务的时候,会将之前对对象做的操作一并提交。就算是在save()方法之后做的操作也一样。什么意思呢?我们看下面的例子:

[java]  view plain  copy
  1. user.setUserName("old");  
  2. session.save(user);  
  3. user.setUserName("new");  
  4. tx.commit();  

执行以上操作,最终user.getUserName();得到的值将会是“new”,而不会是“old”,因为Hibernate在提交事务的时候把对user对象的所有操作都提交了。


OK,今天就到这里,save()方法虽然看起来是一个很简单的方法,但是需要注意这些细小的地方,否则很容易出一些问题。一句话:学习框架的原理很重要,要想理解框架的原理,最直接的办法就是看源码。


每天学一点,每天进步一点。祝大家每天进步。


### HibernateTemplate 的 save 方法使用说明与示例 HibernateTemplate 是 Spring 框架中用于简化 Hibernate 操作的工具类,提供了丰富的 API 来完成常见的 CRUD 操作。其中 `save` 方法用于将一个对象保存到数据库中[^1]。 以下是 `save` 方法的详细说明和使用示例: #### 方法签名 ```java void save(Object entity) ``` - 参数:`entity` 表示需要保存的对象实例。 - 功能:将传入的对象保存到数据库中,并将其标记为持久化状态。如果对象已经存在于数据库中,则不会重复插入[^5]。 #### 使用示例 以下是一个完整的示例代码,展示如何使用 HibernateTemplate 的 `save` 方法将用户数据插入到数据库中: ```java import org.springframework.orm.hibernate5.HibernateTemplate; public class UserDao { private HibernateTemplate hibernateTemplate; public void setHibernateTemplate(HibernateTemplate hibernateTemplate) { this.hibernateTemplate = hibernateTemplate; } // 保存用户数据 public void insertUser(User user) { hibernateTemplate.save(user); // 调用 save 方法保存用户对象 } } ``` #### 注意事项 1. **事务管理**:在使用 HibernateTemplate 时,确保当前线程中存在活动的事务。否则,可能会导致操作失败或数据不一致[^2]。 2. **对象状态**:`save` 方法适用于将瞬时状态的对象转换为持久化状态。如果对象已经是持久化状态(例如通过查询获取的对象),则无需调用 `save` 方法[^3]。 3. **异常处理**:在实际开发中,建议对 `save` 方法的调用进行异常捕获和处理,以应对可能的数据完整性问题或数据库连接异常[^4]。 #### 完整流程示例 以下是一个包含事务管理的完整示例: ```java import org.springframework.transaction.annotation.Transactional; public class UserService { private UserDao userDao; public void setUserDao(UserDao userDao) { this.userDao = userDao; } @Transactional // 确保方法运行在事务中 public void addUser(User user) { try { userDao.insertUser(user); // 调用 DAO 层的 save 方法 } catch (Exception e) { // 异常处理逻辑 e.printStackTrace(); } } } ``` ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值