首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

Hibernate 照射关系总结

2012-09-20 
Hibernate 映射关系总结映射关系设置 ?? 5) 打开二级缓存缓存 主要有session缓存(一级缓存)和sessionfacto

Hibernate 映射关系总结

映射关系设置

    ?

    ?



      5) 打开二级缓存


      缓存

      主要有session缓存(一级缓存)和sessionfactory缓存(内置缓存和外置缓存(也叫二级缓存))

      Session的缓存是内置的,不能被卸载,也被称为Hibernate的第一级缓存(Session的一些集合属性包含的数据)。在第一级缓存中,持久化类的每个实例都具有唯一的OID。

      SessionFactory的缓存又可以分为两类:

      内置缓存(存放SessionFactory对象的一些集合属性包含的数据,SessionFactory的内置缓存中存放了映射元数据和预定义SQL语句,映射元数据是映射文件中数据的拷贝,而预定义SQL语句是在Hibernate初始化阶段根据映射元数据推导出来,SessionFactory的内置缓存是只读的,应用程序不能修改缓存中的映射元数据和预定义SQL语句,因此SessionFactory不需要进行内置缓存与映射文件的同步。)

      外置缓存:SessionFactory的外置缓存是一个可配置的插件。在默认情况下,SessionFactory不会启用这个插件。外置缓存的数据是数据库数据的拷贝,外置缓存的介质可以是内存或者硬盘。SessionFactory的外置缓存也被称为Hibernate的第二级缓存。

      缓存的范围分为三类。

      1 事务范围:缓存只能被当前事务访问。

      2 进程范围:缓存被进程内的所有事务共享。

      3 集群范围:在集群环境中,缓存被一个机器或者多个机器的进程共享。

      持久化层可以提供多种范围的缓存。如果在事务范围的缓存中没有查到相应的数据,还可以到进程范围或集群范围的缓存内查询,如果还是没有查到,那么只有到数据库中查询。事务范围的缓存是持久化层的第一级缓存,通常它是必需的;进程范围或集群范围的缓存是持久化层的第二级缓存,通常是可选的。

      在进程范围或集群范围的缓存,即第二级缓存,会出现并发问题。因此可以设定以下四种类型的并发访问策略,每一种策略对应一种事务隔离级别。

      事务型、读写型、非严格读写型、只读型

        什么样的数据适合存放到第二级缓存中?
        1 很少被修改的数据
        2 不是很重要的数据,允许出现偶尔并发的数据
        3 不会被并发访问的数据
        4 参考数据
        不适合存放到第二级缓存的数据?
        1 经常被修改的数据
        2 财务数据,绝对不允许出现并发
        3 与其他应用共享的数据。

        Hibernate的二级缓存策略的一般过程如下:

        1) 条件查询的时候,总是发出一条select * from table_name where …. (选择所有字段)这样的SQL语句查询数据库,一次获得所有的数据对象。

        2) 把获得的所有数据对象根据ID放入到第二级缓存中。

        3) 当Hibernate根据ID访问数据对象的时候,首先从Session一级缓存中查;查不到,如果配置了二级缓存,那么从二级缓存中查;查不到,再查询数据库,把结果按照ID放入到缓存。

        4) 删除、更新、增加数据的时候,同时更新缓存。

      注意几个关键字的含义

      inverse="true"表示此表不维护表之间的关系,由另外的表维护。

      inverse属性默认是false的,就是说关系的两端都来维护关系。

      false代表由己方来维护关系,true代表由对方来维护关系。在一个关系中,只能由一方来维护关系,否则会出问题(解疑中会讲到);同时也必须由一方来维护关系,否则会出现双方互相推卸责任,谁也不管。

      可以这样理解,cascade定义的是关系两端对象到对象的级联关系;而inverse定义的是关系和对象的级联关系。

      Cascade属性的可能值有

      all: 所有情况下均进行关联操作,即save-update和delete。
      none: 所有情况下均不进行关联操作。这是默认值。
      save-update: 在执行save/update/saveOrUpdate时进行关联操作。
      delete: 在执行delete 时进行关联操作。

      all-delete-orphan: 当一个节点在对象图中成为孤儿节点时,删除该节点。比如在一个一对多的关系中,Student包含多个book,当在对象关系中删除一个book时,此book即成为孤儿节点。

      主键生成策略
      increment,identity,sequence,hilo,native,uuid,foreign,assigned,seqhilo,uuid.hex,uuid.string

      ?

      ?? 面试题:

      1.Hibernate有哪几种查询数据的方式

      2.load()和get()的区别

      3.Hibernate工作原理及为什么要用?
      4.Hibernate是如何延迟加载?
      5.Hibernate中怎样实现类之间的关系?(如:一对多、多对多的关系)
      6. 说下Hibernate的缓存机制
      7. Hibernate的查询方式
      8. 如何优化Hibernate?

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

      1.在数据库中条件查询速度很慢的时候,如何优化?
       
      2.在Hibernate中进行多表查询,每个表中各取几个字段,也就是说查询出来的结果集并没有一个实体类与之对应,如何解决这个问题?
        
      3.session.load()和session.get()的区别

      4.Session在加载实体对象时,将经过的过程:
       
      5.Hibernate的主键生成机制?
      ? -------------Hibernate笔试题----------------------------
      (1)一般情况下,关系数据模型与对象模型之间有哪些匹配关系(多选)
      A)表对应类
      B)记录对应对象
      C)表的字段对应类的属性
      D)表之间的参考关系对应类之间的依赖关系

      (2)以下关于SessionFactory的说法哪些正确?(多选)
      A)对于每个数据库事务,应该创建一个SessionFactory对象
      B)一个SessionFactory对象对应一个数据库存储源。
      C)SessionFactory是重量级的对象,不应该随意创建。如果系统中只有一个数据库存储源,只需要创建一个。
      D)SessionFactory的load()方法用于加载持久化对象

      (3)Customer类中有一个Set类型的orders属性,用来存放Order订单对象,在Customer.hbm.xml文件中,用哪个元素映射orders属性?
      A)<set> B)<one-to-many> C)<many-to-one> D)<property>

      (4)<set>元素有一个cascade属性,如果希望Hibernate级联保存集合中的对象,casecade属性应该取什么值?(单选)
      A)none
      B)save
      C)delete
      D)save-update

      (5)以下哪些属于Session的方法?
      A)load()
      B)save()
      C)delete()
      D)update()
      E)open()
      F)close()

      (6)以下程序的打印结果是什么?(单选)

      tx = session.beginTransaction();
      Customer c1=(Customer)session.load(Customer.class,new Long(1));
      Customer c2=(Customer)session.load(Customer.class,new Long(1));
      System.out.println(c1==c2);
      tx.commit();
      session.close();

      A)运行出错,抛出异常
      B)打印false
      C)打印true

      (7)以下程序代码对Customer的name属性修改了两次:
      tx = session.beginTransaction();
      Customer customer=(Customer)session.load(Customer.class,
      new Long(1));
      customer.setName("Jack");
      customer.setName("Mike");
      tx.commit();

      执行以上程序,Hibernate需要向数据库提交几条update语句?(单选)
      A)0 B)1 C)2 D)3

      (8)在持久化层,对象分为哪些状态?(多选)
      A)临时状态
      B)独立状态
      C)游离状态
      D)持久化状态

      (9)对于以下程序,Customer对象在第几行变为持久化状态?(单选)
      Customer customer=new Cust

热点排行