zoukankan      html  css  js  c++  java
  • Hibernate之深入持久化对象

    Hibernate是一个彻底的O/R Mapping 框架。之所以说彻底,是因为相对于其他的 框架 ,如Spring JDBC,iBatis 需要手动的管理SQL语句,Hibernate采用了完全

    面向对象的方式来操作数据库。

    但是当开发者需要深入的了解Hibernate底层运行时,对Hibernate的数据访问进行优化时,就需要了解Hibernate的底层SQL操作了。由于对于绝大部分的应用来说,

    数据访问是一个十分巨大的,耗时的操作,因此深入Hibernate底层对应的SQL操作非常必要。

    1.持久化类的要求

    所有的持久化类都应该有一个无参构造器。

    提供一个标识属性(Field):标识属性通常是映射数据库表的主键字段。这个属性可以叫任何名字,类型可以是基本类型,基本类型的包装类,String,或者Date。如果该数据库表使用了联合主键,那么这个标识属性可以是用户定义的一个类,这个类拥有联合主键的字段作为属性。虽然Hibernate允许使用基本类型作为标识属性的类型,但还是建议可以用基本类型时,用基本类型的包装类进行代替。

    为持久化类的每个属性提供setter和getter方法:   也就是 JavaBean风格。

    选择性的重写equals()和hashCode()方法:如果需要把持久化类的对象放入Set集合中(当实现关联映射时,推荐这么做),则应该为持久化类重写equals()方法和hashCode()方法。

    2.持久化类的对象的状态
    瞬态状态:对象由new操作符创建出来,且尚未与Hibernate Session对象进行关联,此时的持久化类的对象处于瞬态。对于瞬态状态对象的操作或者改变,不会被保存 到数据库中去。如果程序中失去了对于处于瞬态状态对象的引用,瞬态状态的对象就会被垃圾回收器销毁。通过使用Hibernate Session对象的save()方法,可以把处于瞬态状态的对象,转化为处于持久化状态的对象。

    持久化状态:当一个持久化类的对象,与Hibernate Session对象进行了关联,那么这个对象就处于持久化状态了,处于持久化状态的对象在数据库中有对应的一条记录,并拥有一个持久化标示符。对于持久化状态的对象,进行任何的改动,Hibernate都会自动检测到,然后把改动后的内容写回数据库中。开发者不需要手动的执行update。

    脱管状态:某个处于持久化状态的对象,由于与之关联的Hibernate Session对象的关闭,该对象就由持久化状态沦为脱管状态。如果对于处于脱管状态的对象进行了操作或者修改,而后这个对象重新被Hibernate Session对象进行关联,即重新回到了持久化状态,那么对脱管状态时期的操作不会丢失,也会被写入数据库中。

    3.Hibernate Session对象改变持久化类的对象状态的方法

    sess.save(Object obj)   :将obj对象转化为持久化状态          返回obj对象的标识符。

    sess.persist(Object obj) :将obj对象那个转化为持久化状态     返回值为  void

    使用上面两个方法将一个对象转化为持久化状态    底层会生成一条insert语句

    News  n  = sess.load(News.class ,  new Integer(pk));

         load()方法通过指定持久化类的类对象,和标识属性值  来 返回一个持久化状态的对象 也就会数据库中一条记录。

         类似的还有get()方法。

    使用上面两个方法获得一个持久化状态的对象   底层会生成一条select语句

    n.setTitle("Hibernate");

    通过获得的持久化状态对象,然后对它进行操作    底层;会生成一条update语句

    sess.update(n);  如果n对象处于脱管状态    将n对象与sess对象关联  重新回到持久化状态

    sess.updateOrSave(n);   不清楚n对象现在是处于瞬态 还是脱管状态   都转化为持久化状态 

    sess.merge(n);        将n对象的数据改变添加到数据库中   但是n对象仍然不是持久化状态

    通过上面的方法来处理脱管状态的对象 

    sess.delete(n)   :  删除处于持久化状态的对象   持久化状态的对象对应的数据库记录会被删除

    这条语句   底层会生成一条 delete语句

  • 相关阅读:
    iOS UI(布局)约束是什么?view1.attr1 = view2.attr2 * multiplier + constant
    编程范式-声明式编程
    平庸的投资人和优秀的投资人差在哪儿
    编程语言的发展趋势及未来方向
    再读:编程语言的发展趋势及未来方向
    编程语言的发展趋势:声明式动态并发
    命令式编程与声明式编程
    声明式(编程)语言是解释型语言
    DSL-领域特定语言(英语:domain-specific language、DSL)
    声明式编程
  • 原文地址:https://www.cnblogs.com/wangliyue/p/4133445.html
Copyright © 2011-2022 走看看