菜鸟学SSH——Hibernate——Session之save()方法

本文详细介绍了Hibernate框架中Session的save()方法的工作原理及注意事项,包括如何将临时对象转变为持久化对象,并保存到数据库的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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

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

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

OK,下面来看一个实例:

		//创建SessionFactory
		Configuration config = new Configuration();
		ServiceRegistry  sr = new ServiceRegistryBuilder().applySettings(config.getProperties()).buildServiceRegistry();  
		SessionFactory sessionFactory = config.buildSessionFactory(sr); 
		
		//打开Session
		Session session = sessionFactory.openSession();
		
		//开启事务
		Transaction tx = session.beginTransaction();
		
		//创建临时对象并赋值
		User user = new User();
		user.setId("1");
		user.setUserName("lsj");
		session.save(user);
		
		//提交事务
		tx.commit();
		
		//关闭Session
		session.close();

 

PS:

 

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

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

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

		<id name="id" type="string">
			<generator class="increment">
		</id>


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

		user.setId("1");
		System.out.println("手动赋值为:"+user.getId());
		session.save(user);
		System.out.println("存入数据库的值为:"+user.getId());


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

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

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

		user.setUserName("old");
		session.save(user);
		user.setUserName("new");
		tx.commit();


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

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

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

 

 

 

评论 31
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

刘水镜

文章写得不错,我要让更多人看到

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值