Hibernate保存记录时遇到的一个问题----evitic,not-null配置及主键生成策略
来源:互联网 发布:郫县兼职教师招聘知乎 编辑:程序博客网 时间:2024/05/21 09:18
我要为某一个表(如UserInfo表)保存一条新数据,结果遇到如下的问题
1)UserInfo urf = new UserInfo();
urf.setUserCde("zhangsan_001"); -----此列为主键
urf.setUserName("张三");
urf.setUserAge(22);
urf.setUserSex("男");
session.save(urf); -------1
session.evitic(urf); -------2
结果在运行的时候,报错:possible nonthreadsafe access to session
在查找相关资料的后,通过在1和2之间加入session.flush();方法解决。
参考资料:http://joes0619.blog.163.com/blog/static/1042350320069305011256/
总的来说,就是在使用flush();方法后,数据会同步更新到数据库中。但是这样的更新是按照一定的次序进行的,insert....update....delete的顺序进行的。
而产生这个错误的原因,是因为,urf对象过早的从session中拆离出来。导致在后面hibernate与数据库同步的时候,找不到与session关联的对象。就像上面链接中提到的hiberante的执行过程所提到的那样:“Hibernate在数据库层之上实现了一个缓存区,当应用save或者update一个对象时,Hibernate并未将这个对象实际的写入数据库中,而仅仅是在缓存中根据应用的行为做了登记,在真正需要将缓存中的数据flush入数据库时才执行先前登记的所有行为。”
2)在了解了hibernate的flush机制之前,还曾经因为在UserInfo.hbm.xml的配置中的Age属性有的一个not-null配置,导致我在未给Age赋值时出现错误。
具体的配置为如下:
<property name="Age" type="java.lang.Integer">
<column name="AGE" length="1" not-null="true" />
</property>
注意,以上属性是hibernate在配置文件中进行的非空约束,而在实际的数据库表中则没有此约束。如果通过hibernate来对数据进行数据的操作,则受此约束影响。
3)在解决如上两个问题后,终于成功插入了一条数据。嗯,那就去数据库里面查一下是不是有这条数据吧。结果,我发现,数据库中存的主键字段UserCde的值为“202011072000001”(此处为举例,类似的一串随机数或流水号)。
我实在是很费解,我明明设置的urf的UserCde为“zhangsan_001”,实际到数据库的为什么变了呢?纠结之后,我就去找UserInfo的hibernate配置文件,在看到主键配置的那一刻,我终于明白了。配置如下:
<id name="UserCde" type="java.lang.String">
<column name="USERCDE" length="50" />
<generator class="uuid.hex"></generator>
</id>
- Hibernate保存记录时遇到的一个问题----evitic,not-null配置及主键生成策略
- hibernate 实体注解在主键生成策略方面遇到的问题
- hibernate操作数据库遇到问题的时候检查主键生成策略
- hibernate主键的生成策略
- Hibernate的主键生成策略
- hibernate的主键生成策略
- Hibernate的主键生成策略
- hibernate的主键生成策略
- hibernate的主键生成策略
- hibernate的主键生成策略
- Hibernate主键的生成策略
- Hibernate的主键生成策略
- hibernate的主键生成策略
- Hibernate的主键生成策略
- hibernate的主键生成策略
- Hibernate的主键生成策略
- Hibernate的主键生成策略
- Hibernate的主键生成策略
- 职场进化论--每天淘汰你自己
- 用wpa_cli 连接无线网络
- 移动终端开发配置
- com中的类型对应
- my emacs setup
- Hibernate保存记录时遇到的一个问题----evitic,not-null配置及主键生成策略
- SQL 2008将数据导出到Sql脚本文件的方法
- .NET C# 如何监控并及时的显示另一个控制台Console的输出
- Google封锁整个co.cc子域只能临时止血难以长治久安
- 在ubuntu11.04通过Wine使用中国知网cnki的CAJview阅读器打开*.nh *.caj后缀的文献资料
- 开源协议的概览图
- 一个有趣的小学生算法题
- trac 经验谈之(3)工作流篇
- SQL语句的并集UNION,交集JOIN(内连接,外连接),交叉连接(CROSS JOIN笛卡尔积),差集(NOT IN)