在hibernate中session一级缓存机制中,有这么一种情况:
问题描述:我需要new一个对象,对它的几个字段赋值,但是有一些属性并没有进行赋值,然后调用
session.save()方法,在提交事务后,会出现这样的情况:
1:在数据库中有默认属性的字段的值为空
2:既然是持久化对象,为什么在最后对象拿不到默认属性的值?
通过调试后解决方案如下:
对于问题一,如你在数据库里设置了字段的默认值,但是hibernate并不知道你不设置该属性字段的值就要用表中字段默认值,那么,你要进行如下配置:
<class name="entity.Product" table="t_product" dynamic-insert="true">
说明你要动态的插入你在数据库中设置好的默认值
效果显示:
测试前:
5 | 高尔夫球 | 20.3 | 15-6月 -15 | - |
测试后
6 | 高尔夫球 | 20.3 | 15-6月 -15 | 未知生产地 |
对于问题二,因为在你调用sava方法后,hibernate将此对象放入到它的容器中,对象从游离态转化为
持久化状态,但并不代表你在提交事务后,就能将默认字段的值自动映射到被持久化映射的对象中。
你不执行和该对象有关的CRUD业务时,hibernate不会将默认值和该对象的属性值所对应。最后,你
再调用一次session.get()方法后,可以发现对象和有默认属性相对应的字段有你设置的默认值了~
追加一下,也可以使用session.refresh()方法将数据库中的数据同步到缓存中~
最后,可以通过这个场景加深session一级缓存机制的理解,总结下面对缓存机制,应该有如下的思考:
(1)怎么样从缓存中提取出对象
(2)当缓存中的对象和数据库中的数据不一样的时候,怎么样把缓存中的数据同步到数据库中
(3)当缓存中的对象和数据库中的数据不一样的时候,怎么样把数据库中的数据同步到缓存中