徐老师已经把常见的异常在课堂上进行了演示,说实话,这两天都有点郁闷啊,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.在hibernate中java对象的状态
临时状态(transient):刚刚用new语句创建,没有被持久化,不处于session中。该对象
成为临时对象
持久化状态(persistent):已经被持久化,加入到session的缓存中。该状态的对象为持久
化对象。
游离状态(detached):已经被持久化,但不处于session中。该状态的对象为游离对象。
注意:session的delete方法对于游离对象,该方法从数
据库中删除记录,对于持久化对象,该方法从数据
库中删除记录,还要删除缓存中的对象。
close方法使缓存被清空,缓存中的所有的
对象都变为游离对象。
游离对象处于内存中