今天写了一段代码,通过hibernate首先将数据保存到数据库中,然后再查询出数据。可是,总是查询不到预期的结果,结果却是一个报错,因为用了多对一和一对多关联映射,开始还以为是关系弄错了,检查了半天代码,仍没有结果。最后,才发现竟然栽在一行短短的配置上面了。
它就是hibernate.cfg.xml配置文件中的hibernat.hbm2ddl.auto标签。
先介绍一个这个标签,它包含4个属性:
create : 能够生成表,但是每次运行都会删除上一次的表,重新创建表,哪怕第二次的数据没有任何改变
create-drop : 能够生成表,但是sessionFactory一关闭,表就自动删除
update : 最常用的属性,也能够生成表,即使表结构改变了,表中的行仍然存在,不会删除以前的行
validate : 和create的区别就是,validate只会和数据库中的表进行比较,不会创建新表,但是会插入新值
在我的配置文件中,将属性值设置为create,所以,当执行查询操作时,便会将表中的数据都删掉,所以我就查不到数据啦。
现在我倒有个问题了:
把这个属性去掉,程序照样正确运行,只不过是每保存一次数据,原来的数据依然保留,只是数据会不断的重复增加而已,当然,有新数据时会保存新数据。原来在hibernate的实例中也没有配置这个属性。那么,它的默认属性是哪个呢?
配置成create,每保存一次数据会创建新的表,但是进行其他更新、查询操作时,就需要更改create。如果不进行任何配置,每保存一次数据会进行数据的叠加,但是,对于其他更新、查询操作是不影响的。
可是,实际中的数据库表,应该是既不要重复添加数据,也不要影响更新、查询操作的。这样看来,好像只有在create和update之间进行转换了,可是,这也是不现实的啊。
这个属性应该怎么用呢?
-------------2013年1月9号
恩恩,现在明白了,是我想错了。如果使用update这个值,首先对于更新、查询等操作是没有影响的。对于添加数据,也是没有问题的,因为添加的是否重复试需要在代码中进行逻辑判断滴。
-------------2013年1月11号
1.<property name="hibernate.hbm2ddl.auto">create</property> 加载hibernate.cfg.xml时,创建新表(如果原来存在,先删除)
2.<property name="hibernate.hbm2ddl.auto">update</property> 加载hibernate.cfg.xml时,更新表结构(如果原表不存在,就创建新表;如果缺少相应的字段,就加入;对于原来存在的多余字段,不作处理)
3.<property name="hibernate.hbm2ddl.auto">create-drop</property> 加载hibernate时创建,退出时删除表结构
4.<property name="hibernate.hbm2ddl.auto">validate</property> 加载hibernate时,验证创建数据库表结构
-----------------2013年3月6号补充
现在对于update的补充更加完整一些。