随笔-54  评论-0  文章-2  trackbacks-0

徐老师已经把常见的异常在课堂上进行了演示,说实话,这两天都有点郁闷啊,Hibernate咋挺难懂的,老师讲的比较深,一天下来,晚上再看一遍老师的视频,才基本上可以搞清楚课堂上不理解 的知识点。今天讲的双向关联和检索策略。

1.双向关联

1.一对多关联关系

属性方式

2.在昨天的custrom.java中,主要代码:

       private Set<Order> orders = new HashSet<Order>();

      

       public Set<Order> getOrders() {

              return orders;

       }

       public void setOrders(Set<Order> orders) {

              this.orders = orders;

       }

3.Custromer.hbm.xml

<class>中加上:

<set name="orders" lazy="false" inverse="true">

                     <key column="cid" />

                     <one-to-many class="cn.itcast.hibernate.persistence.Order" />

              </set>

 

4.测试: 主要代码:

Customer c = new Customer();

              c.setAge(12);

             

              Order o = new Order();

              o.setOrderNumber("No003");

              o.setPrice(500f);

              //设置关联关系

              o.setCustomer(c);

             

              //s.save(c);

              s.save(o);

 

5.通过Hibernate 查询客户所有订单

 

s.get(Order.class,new Long(1));

debug模式查看所有订单信息

 

注意:双向关联是两端同时进 行

2.操纵持久化对象:

对缓存的理解:首先明白一点:

显式回收:

当没有任何一个对象引用或者指针指向他时,就回收

 

1.当用session 增删改查对象时,用seesion.flush()方法可以实现将数据插入数据库,但不提交事务,。

  之后调用session.clear(),清空本地缓存

 

2.commit()方法默认包含两步操作:先清理缓 存,后提交

 

缓存里放的全是引用

 

s.flush();//清理缓存  以缓存为准,让数据库 和缓存保持同步,让缓存进行一系列增删该查, 改变将进入数据库,但不提交 ,仍然可以回滚等操作

s.refresh();  //刷新缓存  让缓存和数据库保持同步, 以数据库为准,触发一个查询操作,把数据找回来

s.clear();//显式清空    缓存是集合 ,里面放了很多引用,把缓存清掉,为的是释放内存,如果缓存内有指向它的引用,则清掉,但如果缓存外还有其他引用到达他,则不释放内存

 

例如:

Customer c = new Customer(“TOM”,new HashSet());

session.save(c);

Long id = c.getId();

c = null;

Customer c2 = (Customer)session.load(Customer.class,id);

tx.commit();

session.close();

c2.getName(); //这时仍然可以得到name

C2 = null;//之后如果再调用上面的语句,则不能得到name

---------------------------------------------------------------------------------------------

缓存的作用:

1。减少访问数据库的频率。

2。保证缓存中的对象与数据库中的相关记录保持同步。

3。当缓存中的持久化对象之间存在循环关联关系时,Session会保证不出现访问对象图的死循

     还,以及由死循环引起的JVM堆栈溢出异常。

提示:

session加载了customer对象后,会为customer对象的值类型的属性复制一份快照。当清理

缓存时,通过比较对象的当前属性和快照,来判断对象的那些属性发生了变化。

 

3.hibernatejava对象的状态

临时状态(transient):刚刚用new语句创建,没有被持久化,不处于session中。该对象

成为临时对象

持久化状态(persistent):已经被持久化,加入到session的缓存中。该状态的对象为持久

   化对象。

游离状态(detached):已经被持久化,但不处于session中。该状态的对象为游离对象。

注意:sessiondelete方法对于游离对象,该方法从数

      据库中删除记录,对于持久化对象,该方法从数据

      库中删除记录,还要删除缓存中的对象。

   close方法使缓存被清空,缓存中的所有的

      对象都变为游离对象。

游离对象处于内存中

posted on 2010-01-31 23:32 d66380022 阅读(133) 评论(0)  编辑  收藏