菜鸟在Hibernate的路上前行–验证持久态对象的特性

验证持久态对象的特性

1.1 问题

设计出案例,验证持久态对象的特性:
1. 持久态对象存在于一级缓存中。
2. 持久态对象可以自动更新至数据库。
3. 持久态对象自动更新数据库的时机是session.flush()。

1.2 方案

设计3个案例,分别验证持久态对象的3个特性:
1. 新增一条数据,在新增后该数据对象为持久态的,然后根据对象的ID再次查询数据。执行时如果控制台不重新输出SQL则验证了持久态对象存在于一级缓存。
2. 新增一条数据,在新增后该对象为持久态的,然后修改这个对象的任意属性值,并提交事务。在执行时,如果发现数据库中的数据是修改后的内容,则验证了持久态对象可以自动更新至数据库。
3. 查询一条数据,该数据对象为持久态的,然后修改对象的任意属性值,再调用session.flush()方法,并且不提交事务。如果执行时控制台输出更新的SQL,则验证了一级缓存对象更新至数据库的时机为session.flush()。

1.3 步骤

实现此案例需要按照如下步骤进行。

步骤一:创建验证对象持久性测试类

在com.souvc.test包下,创建一个测试类TestPersistent,在其中写出验证对象持久性的3个测试方法,用以验证对象持久性的3个特性,代码如下:

 

步骤二:测试

分别执行上述3个测试方法,观察控制台输出的SQL,看是否与方案中描述的一致。

test1()执行后,控制台输出结果如下图,可以看出后面的查询并没有再次访问数据库,验证了持久态对象是存在于一级缓存中的。

 

test2()执行后,控制台输出结果如下图,可以看出Hibernate自动执行了一次更新,验证了持久态对象会自动更新至数据库。

EMP表查询结果如下图,可以看出最后一条数据的名称的确被更新为猪八戒。

test3()执行后,控制台输出结果如下图,可以看出Hibernate自动执行了一次更新,验证了自动更新的时机是session.flush()。

EMP表查询结果如下图,可以看出最后一条数据的名称并没有更新为太上老君,说明session.flush只是触发更新,并没有提交事务。

 

 






如果您认为本教程质量不错,读后觉得收获很大,预期工资能蹭蹭蹭的往上涨,那么不妨小额赞助我一下,让我有动力继续写出高质量的教程。

发布者

souvc

souvc

搜你所想,投你所好。

发表评论