hibernate配置文件的hibernate.hbm2ddl.auto

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/liusong0605/article/details/8487357

        今天写了一段代码,通过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的补充更加完整一些。

                 


        

阅读更多
换一批

关于hibernate配置文件中,hibernate.hbm2ddl.auto值的设置?

09-10

配置文件中属性hibernate.hbm2ddl.auto设置为create,在调用add()方法的时候,能正确插入数据,为什么调用query方法的时候会出现空指针异常,而且查询完毕后,数据库中表的内容被清空rnrn请大家帮兄弟看看,感激不尽!rnHibernate.cfg.xml:rn[code=XML][/code]creaternrnrn执行代码:rn[code=Java][/code] public static void main(String[] args) rn add();rn query(2);rn rn rn static void add() rn Session s = null;rn Transaction tx = null;rnrn Department depart = new Department();rn depart.setName("depart");rn Set emps = new HashSet();rnrn Employee emp1 = new Employee();rn emp1.setDepart(depart);rn emp1.setName("emp1");rn emp1.setBirthday(new Date());rnrn Skill skiller1 = new Skill();rn skiller1.setDepart(depart);rn skiller1.setSkill("skill");rn skiller1.setName("skiller1");rnrn Saler saler = new Saler();rn saler.setDepart(depart);rn saler.setSale(100);rn saler.setName("saler");rnrn emps.add(emp1);rn emps.add(skiller1);rn emps.add(saler);rnrn depart.setEmps(emps);rnrn try rn s = HibernateUtil.getSession();rn tx = s.beginTransaction();rnrn s.save(depart);rn s.save(emp1);rn s.save(skiller1);rn s.save(saler);rnrn tx.commit();rn catch (Exception e) rn e.printStackTrace();rn finally rn if (s != null) rn s.close();rn rn rn rnrn static Employee query(int id) rn Session s = null;rn Transaction tx = null;rnrn try rn s = HibernateUtil.getSession();rn tx = s.beginTransaction();rnrn Employee emp = (Employee)s.get(Employee.class, id);rn System.out.println(emp.getClass());rnrn tx.commit();rn return emp;rn finally rn if (s != null) rn s.close();rn rn rn

没有更多推荐了,返回首页