博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Hibernate上路_10-持久化对象操作
阅读量:5998 次
发布时间:2019-06-20

本文共 2113 字,大约阅读时间需要 7 分钟。

hot3.png

1.save方法: 

将瞬时对象转换为持久对象(放入一级缓存),hibernate生成insert语句,为瞬时对象设置OID。

不要修改OID,hibernate的更新、删除操作都是通过OID进行。

2.update方法: 

l 如果程序中出现两个持久对象具有相同OID ,报错:

org.hibernate.NonUniqueObjectException: a different object with the same identifier value was already associated with the session: [cn.itcast.domain.Book#1] 

l 操作脱管对象,调用session.update,默认一定产生update语句;

1)POJO.hbm.xml配置:

2)操作function:

public void test() {		Session session = UtilGetSession.openSession();		Transaction transaction = session.beginTransaction();			//此对象和数据库中的内容完全一致		PojoUser user = new PojoUser();		user.setId(1);		user.setName("Beyonce");		user.setAge(32);		user.setCity("Usa");				//因为POJO.hbm.xml中 select-before-update="true"		//hibernate首先执行查询,对比数据库发现数据完全一致,所以不执行下面的update		session.update(user);				transaction.commit();		session.close();	}

3)结果:

l 执行update操作时,若脱管对象OID在数据库中不存在,会抛出异常:

org.hibernate.StaleObjectStateException: Row was updated or deleted by another transaction (or unsaved-value mapping was incorrect): [cn.itcast.domain.Book#2] 

3.saveOrUpdate:

执行此操作时,hibernate会先判断当前对象是否具有OID,然后选择性执行save或者update。对持久化对象无效果。 

如果当前对象有OID,进行update操作;如果当前对象没有OID,为null时,一定执行save;进行save操作。 

当对象的OID值为POJO.hbm.xml文件配置的unsaved-value值时,将作为瞬时对象,即把这个OID值视为null。 

1)POJO.hbm.xml文件:

2)操作:

public void test() {		Session session = UtilGetSession.openSession();		Transaction transaction = session.beginTransaction();			//设置了OID,是脱管对象 		PojoUser user = new PojoUser();		user.setId(0);	//OID是0,在数据库不存在 		user.setName("Beyonce");		user.setAge(32);		user.setCity("America");				//框架获取到对象的OID,执行update。		//但查询后,此OID不存在于数据库,StaleObjectStateException异常。  //在hbm文件配置此OID,被看做null。脱管对象转为瞬时对象,然后被执行save。 		session.saveOrUpdate(user); 				transaction.commit();		session.close();	}

4.get/load: 

根据id获得持久对象。

1)get立即执行返回目标对象,如果OID不存在则返回null;

2)load延迟加载,首先返回目标类子类对象(代理对象),如果OID不存在则报异常ObjectNotFoundException。

5.delete: 

1)delete方法可以删除一个脱管对象,也可以删除持久对象。对象从一级缓存清除后不可继续使用。

2)删除脱管对象时,hibernate先将其变为持久对象,然后执行删除。

- end

转载于:https://my.oschina.net/vigiles/blog/175740

你可能感兴趣的文章
C# 全角和半角转换以及判断的简单代码
查看>>
正则表达式
查看>>
插件推荐系列
查看>>
An introduction to parsing text in Haskell with Parsec
查看>>
Redis在java开发中使用
查看>>
input file样式美化
查看>>
博客园页面设置
查看>>
docker环境搭建
查看>>
开发过程中,ps要做的事情
查看>>
[IOS] Storyboard全解析-第一部分
查看>>
CSS:opacity 的取值范围是 0~1
查看>>
Silverlight 自定义的附加属性
查看>>
常见问题
查看>>
Sqlite插入或更新
查看>>
Jenkins添加Windows自动化构建方案
查看>>
调用天气预报接口
查看>>
node.js中使用http模块创建服务器和客户端
查看>>
LeetCode 453. Minimum Moves to Equal Array Elements C#
查看>>
Away3D基础教程(六):支持双面交互的PlaneGeometry
查看>>
(十五)Centos之安装jdk
查看>>