java对象持久化技术_精通Hibernate:Java对象持久化技术详解

:概念模型---〉关系数据模型--〉域模型

域对象之间的关系 :

1 :关联(Association)

2:依赖 (Dependency)

3:聚集 (Aggregation)

4 :一般化 (Generalization)

二 :SessionFactory接口 与 Session 接口

SessionFactory 接口特点 :

1 :他是线程安全的,它的同一个实例可以被应用的多个线程共享。

2 :他是重量级的,意味着不能随意创建和销毁它的实例,它需要一个很大的缓存,用来存放预定义的SQL语句以及映射元数据等

3 :用户还可以为SessionFactory配置一个缓存插件,该插件被称为Hibernate的第二级缓存,该缓存用来存放被工作单元读过的数据,将来其它工作单元可能会重用这些数据,一个工作单元对应一个数据库事务。

Session接口 特点 :

1 :不是线程安全的,应该避免多个线程共享同一个session实例。

2 : Session实例是轻量级的,它的创建和销毁不需要消耗太多资源。

3  : Session有一个缓存,被称为Hibernate的第一级缓存,每个Session实例都有自己的缓存。处于缓存中的对象处于持久化状态,它和数据库中的相关记录对应,Session能够在某些时间点,按照缓存中持久化对象的属性变化来同步更新数据库,这个过程被称为清理缓存。

三 :cascade用法

b3420ac799f6147ccf9d418725b46427.gif

b3420ac799f6147ccf9d418725b46427.gif        name="customer"

b3420ac799f6147ccf9d418725b46427.gif        column="CUSTOMER_ID"

b3420ac799f6147ccf9d418725b46427.gifclass="mypack.Customer"

b3420ac799f6147ccf9d418725b46427.gif        cascade="save-update"b3420ac799f6147ccf9d418725b46427.gif        not-null="true" />

当cascade属性为 "save-update",默认是 "none"

,表明保存或更新当前对象时(即执行insert或update语句时)会级联保存或更新与它关联的对象。

当一个持久化对象,引用一个临时对象时(有时候是添加,有时候是在flush时)会发生异常。

cascade="all|none|save-update|delete|all-delete-orphan"

四 :Java 集合 (如 Set,List和Map)的一个重要特征是 :集合中存放的是Java对象的引用,当向集合中添加一个对象时,其实是把这个对象的引用添加到集合中。

五 :批量更新

1 :最耗资源的方式 :执行壹万句update操作

b3420ac799f6147ccf9d418725b46427.giftx = session.beginTransaction();

b3420ac799f6147ccf9d418725b46427.gifIterator customers = session.find("from Customer c where c.age>0").iterator();

3ecbda5ab529958662f02f485e218ab9.gif

95d481160ead958b430a50aeb4693e84.gifwhile(customers.hasNext())6d564fa275ae95f65aa763e0bf74be11.gif{

8eb77ae24e7aa502ec5a58bac5de74e1.gif    Customer customer = (Customer)customers.next();

8eb77ae24e7aa502ec5a58bac5de74e1.gif    customer.setAge(customer.getAge()+1);

b00e5793d40858f77b38b2307a12bfc9.gif}b3420ac799f6147ccf9d418725b46427.giftx.commit();

b3420ac799f6147ccf9d418725b46427.gifsession.close();

2 :稍微好一点,释放了一级缓存中的资源,但仍 1万句update数据库操作。

b3420ac799f6147ccf9d418725b46427.giftx = session.beginTransaction();

b3420ac799f6147ccf9d418725b46427.gifIterator customers = session.find("from Customer c where c.age>0").iterator();

3ecbda5ab529958662f02f485e218ab9.gif

95d481160ead958b430a50aeb4693e84.gifwhile(customers.hasNext())6d564fa275ae95f65aa763e0bf74be11.gif{

8eb77ae24e7aa502ec5a58bac5de74e1.gif    Customer customer = (Customer)customers.next();

8eb77ae24e7aa502ec5a58bac5de74e1.gif    customer.setAge(customer.getAge()+1);

8eb77ae24e7aa502ec5a58bac5de74e1.gif

8eb77ae24e7aa502ec5a58bac5de74e1.gif    session.flush();

8eb77ae24e7aa502ec5a58bac5de74e1.gif   session.evict(customer);

b00e5793d40858f77b38b2307a12bfc9.gif}b3420ac799f6147ccf9d418725b46427.giftx.commit();

b3420ac799f6147ccf9d418725b46427.gifsession.close();

3 :绕过hibernate API 直接通过JDBC API来执行该SQL语句

b3420ac799f6147ccf9d418725b46427.giftx = session.beginTransaction();

b3420ac799f6147ccf9d418725b46427.gifConnection con = session.connection();

b3420ac799f6147ccf9d418725b46427.gifPreparedStatement stmt = con.prepareStatement("update Custormers set age= age+1 where age>0");

b3420ac799f6147ccf9d418725b46427.gifstmt.executeUpdate();

b3420ac799f6147ccf9d418725b46427.giftx.commit();


版权声明:本文为weixin_28857713原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。