当前位置: 首页 > news >正文

好的平面设计灵感网站广西壮族自治区市场监督管理局官网

好的平面设计灵感网站,广西壮族自治区市场监督管理局官网,动易网站 设置背景图片,北京网站建设 公司1.为什么要使用Hibernate开发你的项目呢#xff1f;Hibernate的开发流程是怎么样的#xff1f; 为什么要使用①.对JDBC访问数据库的代码做了封装#xff0c;大大简化了数据访问层繁琐的重复性代码。②.Hibernate 是一个基于JDBC的主流持久化框架#xff0c;是一个优秀的ORM…1.为什么要使用Hibernate开发你的项目呢Hibernate的开发流程是怎么样的 为什么要使用 ①.对JDBC访问数据库的代码做了封装大大简化了数据访问层繁琐的重复性代码。 ②.Hibernate 是一个基于JDBC的主流持久化框架是一个优秀的ORM 实现。他很大程度的简化DAO层的编码工作 ③.hibernate 的性能非常好因为它是个轻量级框架。映射的灵活性很出色。它支持各种关系数据库从一对一到多对多的各种复杂关系。 开发流程 2.什么是延迟加载 延迟加载机制是为了避免一些无谓的性能开销而提出来的所谓延迟加载就是当在真正需要数据的时候才真正执行数据加载操作。在Hibernate中提供了对实体对象的延迟加载以及对集合的延迟加载另外在Hibernate3中还提供了对属性的延迟加载。 3.说一下hibernate的缓存机制 Ahibernate一级缓存 1hibernate支持两个级别的缓存默认只支持一级缓存 2每个Session内部自带一个一级缓存 3某个Session被关闭时其对应的一级缓存自动清除 Bhibernate二级缓存 (1) 二级缓存独立于session默认不开启 4.Hibernate的查询方式有哪些 本地SQL查询、Criteria、Hql 5.如何优化Hibernate 1.使用双向一对多关联不使用单向一对多 2.灵活使用单向一对多关联 3.不用一对一用多对一取代 4.配置对象缓存不使用集合缓存 5.一对多集合使用Bag,多对多集合使用Set 6. 继承类使用显式多态 7. 表字段要少表关联不要怕多有二级缓存撑腰  6.Hibernate中GET和LOAD的区别 请注意如果没有匹配的数据库记录load()方法可能抛出无法恢复的异常(unrecoverable exception)。 如果类的映射使用了代理(proxy)load()方法会返回一个未初始化的代理直到你调用该代理的某方法时才会去访问数据库。若你希望在某对象中创建一个指向另一个对象的关联又不想在从数据库中装载该对象时同时装载相关联的那个对象那么这种操作方式就用得上的了。 如果为相应类映射关系设置了batch-size 那么使用这种操作方式允许多个对象被一批装载因为返回的是代理无需从数据库中抓取所有对象的数据。 如果你不确定是否有匹配的行存在应该使用 get()方法它会立刻访问数据库如果没有对应的行会返回null。 session.get 方法 查询立即执行 返回Customer类对象 session.load 方法默认采用延迟加载数据方式不会立即查询返回 Customer类子类对象 动态生成代理对象 * 如果 PO类使用final修饰load无法创建代理对象返回目标对象本身 load效果和 get效果 相同   7.说说在 hibernate中使用Integer做映射和使用int做映射之间有什么差别 Integer code和int code的区别: Integer是对象.      codenull;   对象可以为空.    int 是普通类型,     不可能null.        根据你的数据库code是可以空的,故应该映射成Integer.       你没理由hbm.xml里写 Integer,类里却写int 8.SQL和HQL有什么区别 sql 面向数据库表查询 hql 面向对象查询   hqlfrom 后面跟的 类名类对象 where 后 用 对象的属性做条件 sqlfrom 后面跟的是表名  where 后 用表中字段做条件 查询 在Hibernate中使用查询时一般使用Hql查询语句。 HQLHibernate Query Language即Hibernate的查询语言跟SQL非常相像。不过HQL与SQL的最根本的区别就是它是面向对象的。   使用HQL时需要注意以下几点 1.大小写敏感 因为HQL是面向对象的而对象类的名称和属性都是大小写敏感的所以HQL是大小写敏感的。 HQL语句from Cat as cat where cat.id 1;与from Cat as cat where cat.ID 1;是不一样的这点与SQL不同。 2.from子句 from Cat该句返回Cat对象实例开发人员也可以给其加上别名eg. from Cat as cat对于多表查询的情况可参考如下 from Cat as cat, Dog as dog 其它方面都与SQL类似在此不再赘述。 9.Hibernate的分页查询 例如从数据库中的第20000条数据开始查后面100条记录 Query q session.createQuery(from Cat as c);;    q.setMaxResults(100);;    List l q.list();; q.setFirstResult(20000);;   10.Hibernate中Java对象的状态以及对应的特征有哪些 持久化对象的三种状态     持久化对象PO和OID POPOJO hbm映射配置     编写规则 ①必须提供无参数public构造器②所有属性private提供public的getter和setter方法③必须提供标识属性与数据表中主键对应例如Customer类 id属性④PO类属性应尽量使用基本数据类型的包装类型(区分空值)  例如int---Integer  long---Long⑤不要用final修饰将无法生成代理对象进行优化 OID 指与数据表中主键对应 PO类中属性例如 Customer类 id属性 Hibernate框架使用OID来区分不同PO对象         * 例如内存中有两个PO对象只要具有相同 OID Hibernate认为同一个对象     * Hibernate 不允许缓存同样OID的两个不同对象 ①瞬时态(临时态、自由态)不存在持久化标识OID尚未与Hibernate Session关联对象被认为处于瞬时态失去引用将被JVM回收 ②持久态存在持久化标识OID与当前session有关联并且相关联的session没有关闭 ,并且事务未提交 ③脱管态(离线态、游离态)存在持久化标识OID但没有与当前session关联脱管状态改变hibernate不能检测到 区分三种状态判断对象是否有OID判断对象是否与session关联(被一级缓存引用) // 获得Session Session session HibernateUtils.openSession(); // 开启事务 Transaction transaction session.beginTransaction();   Book book newBook();// 瞬时态(没有OID未与Session关联) book.setName(hibernate精通); book.setPrice(56d);   session.save(book);// 持久态(具有OID与Session关联)   // 提交事务关闭Session transaction.commit(); session.close();   System.out.println(book.getId());// 脱管态(具有 OID与Session断开关联) 持久化对象状态转换 ①瞬时态对象通过new获得 瞬时-----持久    save、saveOrUpdate(都是session) 瞬时-----脱管    book.setId(1) 为瞬时对象设置OID ②持久态对象通过get/load 、Query查询获得 持久-----瞬时    delete  被删除持久化对象 不建议再次使用 持久-----脱管    evict(清除一级缓存中某一个对象)、close(关闭Session清除一级缓存)、clear(清除一级缓存所有对象 ) ③脱管态对象 无法直接获得 脱管-----瞬时    book.setId(null); 删除对象OID 脱管-----持久    update、saveOrUpdate、 lock(过时) 11.Hibernate中怎样处理事务? Hibernate是对JDBC的轻量级对象封装Hibernate本身是不具备Transaction 处理功能的Hibernate的Transaction实际上是底层的JDBC Transaction的封装或者是JTA Transaction的封装下面我们详细的分析 Hibernate可以配置为JDBCTransaction或者是JTATransaction这取决于你在hibernate.properties中的配置: #hibernate.transaction.factory_class net.sf.hibernate.transaction.JTATransactionFactory#hibernate.transaction.factory_class net.sf.hibernate.transaction.JDBCTransactionFactory 如果你什么都不配置默认情况下使用JDBCTransaction如果你配置为 hibernate.transaction.factory_class net.sf.hibernate.transaction.JTATransactionFactory 将使用JTATransaction不管你准备让Hibernate使用JDBCTransaction还是JTATransaction我的忠告就是什么都不配将让它保持默认状态如下  #hibernate.transaction.factory_class net.sf.hibernate.transaction.JTATransactionFactory#hibernate.transaction.factory_class net.sf.hibernate.transaction.JDBCTransactionFactory 在下面的分析中我会给出原因。 一、JDBC Transaction 看看使用JDBC Transaction的时候我们的代码例子 Session session sf.openSession();Transaction tx session.beginTransactioin();...session.flush();tx.commit();session.close(); 这是默认的情况当你在代码中使用Hibernate的Transaction的时候实际上就是JDBCTransaction。那么JDBCTransaction究竟是什么东西呢来看看源代码就清楚了 Hibernate2.0.3源代码中的类 net.sf.hibernate.transaction.JDBCTransaction:public void begin() throws HibernateException {    ...    if (toggleAutoCommit) session.connection().setAutoCommit(false);    ...} 这是启动Transaction的方法看到 connection().setAutoCommit(false) 了吗是不是很熟悉 再来看 public void commit() throws HibernateException {    ...    try {        if ( session.getFlushMode()!FlushMode.NEVER ) session.flush();    try {        session.connection().commit();        committed  true;    }    ...    toggleAutoCommit();} 这是提交方法看到connection().commit() 了吗下面就不用我多说了这个类代码非常简单易懂通过阅读使我们明白Hibernate的Transaction都在干了些什么我现在把用 Hibernate写的例子翻译成JDBC大家就一目了然了 Connection conn  ...; --- session sf.openSession();conn.setAutoCommit(false); --- tx session.beginTransactioin();... --- ...conn.commit(); --- tx.commit(); (对应左边的两句)conn.setAutoCommit(true);conn.close(); --- session.close(); 看明白了吧Hibernate的JDBCTransaction根本就是conn.commit而已根本毫无神秘可言只不过在Hibernate中 Session打开的时候就会自动conn.setAutoCommit(false)不像一般的JDBC默认都是true所以你最后不写 commit也没有关系由于Hibernate已经把AutoCommit给关掉了所以用Hibernate的时候你在程序中不写 Transaction的话数据库根本就没有反应。 12.简单的介绍一下Hibernate的核心API 1.Configuration 用于加载hibernate配置 ①加载核心属性配置hibernate.properties和hibernate.cfg.xml //方式一去src 读取 hibernate.properties 属性配置文件 Configuration cfg newConfiguration();  //方式二去src读取 hibernate.cfg.xml   Configuration cfg newConfiguration().configure();   Configuration cfg newConfiguration().configure(自定义xml文件);去src 加载指定文件  ②手动加载hbm映射配置持久化类与数据表的映射关系*.hbm.xml 文件 如果没有对PO类进行hbm映射会报错 org.hibernate.MappingException:Unknown entity: cn.itcast.domain.Customer  那么我们可以手动加载其映射文件 //方式一 configuration.addResource(cn/itcast/domain/Customer.hbm.xml);加载hbm文件  //方式二 configuration.addClass(Customer.class);加载Class自动搜索hbm映射文件 * 如果使用 hibernate.cfg.xml配置将映射配置xml中 mapping resourcecn/itcast/domain/Customer.hbm.xml/ 2.SessionFactory ①保存了当前的数据库配置信息和所有映射关系以及预定义的SQL语句这个对象是线程安全的 //预定义SQL语句 sql-querynamelogin     ![CDATA[select * from user where username ? and password ?]] /sql-query 3.Session 代表hibernate操作会话对象相当于Connection  session是一个单线程对象线程不安全在方法内部定义和使用Session不会出现线程问题 * 每个线程方法调用栈是线程私有的 session 进行PO(Persistent Object)对象常见持久化操作, 存在一级缓存 常用API save 完成插入 update 完成修改 delete完成删除 get/load 根据主键字段查询 createQuery、 createSQLQuery 创建查询对象Query接收HQLSQLQuery接收SQL createCriteria()  面向对象条件查询 4.Transaction 事务操作 commit 提交 rollback 回滚 如果没有开启事务那么每个Session的操作都相当于一个独立的事务 * 事务是否提交 //默认false property namehibernate.connection.autocommitfalse/property 事务不提交 propertynamehibernate.connection.autocommittrue/property 事务提交 5.Query session.createQuery()获得 面向对象查询操作类操作属性 接收参数 HQL语句 开发代码步骤     获得HibernateSession对象     编写HQL语句     调用session.createQuery 创建查询对象     如果HQL语句包含参数则调用Query的setXXX设置参数     调用Query对象的list()或uniqueResult()方法执行查询 6.Criteria 接口QBC查询 Query By Criteria 主要为了解决多条件查询问题以面向对象的方式添加条件无需拼接HQL语句  13.update与saveOrUpdate有什么区别 save() 方法很显然是执行保存操作的如果是对一个新的刚new出来的对象进行保存自然要使用这个方法了数据库中没有这个对象。 update() 如果是对一个已经存在的托管对象进行更新那么肯定是要使用update方法了数据中有这个对象。 saveOrUpdate() 这个方法是更新或者插入有主键就执行更新如果没有主键就执行插入。【此方法慎用】 在Hibernate中saveOrUpdate()方法在执行的时候先会去session中去找存不存在指定的字段如果存在直接update否则save这个时候问题就发生了。     有两张表表A和表B这两张表的主键都是一样的例如都是MASTER_ID同时对应的BO里面属性都是masterID现在要执行的操作是以 MASTER_ID为条件将表A中的数据查询出来然后将部分值插入到表B中然后再更新表B在查询表A后session中已经存在masterID 了这个时候再去对表B进行savaOrUpdate的时候Hibernate会发现session中已经存在masterID了所以执行的就是 update但是实际上表B中根本不存在masterID这个值当你执行完查询数据库的时候会发现没有插入数据像这种情况就得先用 masterID对表B进行查询当返回的BO为NULL时new一个新BO然后再进行插入这个时候用到的就是createbo了。 14.Hibernate的inverse属性的作用 1明确inverse和cascade的作用  inverse 决定是否把对对象中集合的改动反映到数据库中所以inverse只对集合起作用也就是只对one-to-many或many-to-many有效因为只有这两种关联关系包含集合而one-to-one和many-to-one只含有关系对方的一个引用。 cascade决定是否把对对象的改动反映到数据库中所以cascade对所有的关联关系都起作用因为关联关系就是指对象之间的关联关系。 2.inverse属性 inverse所描述的是对象之间关联关系的维护方式。 inverse只存在于集合标记的元素中 。Hibernate提供的集合元素包括set/ map/ list/ array / bag / Inverse属性的作用是是否将对集合对象的修改反映到数据库中。 inverse属性的默认值为false表示对集合对象的修改会被反映到数据库中inversefalse 的为主动方由主动方负责维护关联关系。  inverse”true” 表示对集合对象的修改不会被反映到数据库中。为了维持两个实体类表的关系而添加的一些属性该属性可能在两个实体类表或者在一个独立的表里面这个要看这双方直接的对应关系了 这里的维护指的是当主控放进行增删改查操作时会同时对关联关系进行对应的更新。    一对多 该属性在多的一方。应该在一方的设置 inversetrue 多的一方设置 inversefalse多的一方也可以不设置inverse属性因为默认值是false这说明关联关系由多的一方来维护。如果要一方维护关 系就会使在插入或是删除一方时去update多方的每一个与这个一的对象有关系的对象。而如果让多方面维护关系时就不会有update 操作因为关系就是在多方的对象中的直指插入或是删除多方对象就行了。显然这样做的话会减少很多操作提高了效率。 注单向one-to-many关联关系中不可以设置inversetrue,因为被控方的映射文件中没有主控方的信息。    多对多 属性在独立表中。inverse属性的默认值为false。在多对多关联关系中关系的两端 inverse不能都设为false,即默认的情况是不对的如果都设为false,在做插入操作时会导致在关系表中插入两次关系。也不能都设为 true如果都设为true,任何操作都不会触发对关系表的操作。因此在任意一方设置inversetrue另一方inversefalse。    一对一 其实是一对多的一个特例,inverse 的设置也是一样的主要还是看关联关系的属性在哪一方这一方的inversefalse。    多对一 也就是一对多的反过来没什么区别。 3.cascade属性 级联操作指当主控方执行某项操作时是否要对被关联方也执行相同的操作。 cascade属性的作用是描述关联对象进行操作时的级联特性。因此只有涉及到关系的元素才有cascade属性。具有cascade属性的标记包括many-to-one / one-to-one / any / set /bag / idbag / list / array / 注意one-to-many /和 many-to-many /是用在集合标记内部的所以是不需要cascade属性的。 4.inverse和cascade的区别 作用的范围不同     Inverse是设置在集合元素中的。     Cascade对于所有涉及到关联的元素都有效。     many-to-one/ont-to-many/没有inverse属性但有cascade属性 执行的策略不同     Inverse 会首先判断集合的变化情况然后针对变化执行相应的处理。     Cascade 是直接对集合中每个元素执行相应的处理 执行的时机不同     Inverse是在执行SQL语句之前判断是否要执行该SQL语句     Cascade则在主控方发生操作时用来判断是否要进行级联操作 执行的目标不同     Inverse对于ont-to-many和many-to-many处理方式不相同。     对于ont-to-manyinverse所处理的是对被关联表进行修改操作。     对于many-to-manyinverse所处理的则是中间关联表     Cascade不会区分这两种关系的差别所做的操作都是针对被关联的对象。 总结  one-to-many     one-to-many中建议inverse”true”由“many”方来进行关联关系的维护     many-to-many中只设置其中一方inverse”false”或双方都不设置     Cascade通常情况下都不会使用。特别是删除一定要慎重。 操作建议 一般对many-to-one和many-to-many不设置级联这要看业务逻辑的需要;对one-to-one和one-to-many设置级联。     many-to-many关联关系中一端设置inverse”false”另一端设置为inverse”true”。在one-to-many关联关系中设置inverse”true”,由多端来维护关系表 Hibernate一级缓存相关问题 1.Session中的一级缓存 Hibernate框架共有两级缓存 一级缓存Session级别缓存、二级缓存SessionFactory级别缓存 在Session接口的实现中包含一系列的 Java 集合, 这些 Java 集合构成了 Session 缓存.  持久化对象保存Session一级缓存中(一级缓存引用持久化对象地址)只要 Session 实例没有结束生命周期, 存放在它缓存中的对象也不会结束生命周期 Hibernate Session接口的实现类SessionImpl类(查看源码右击session选择Open Type Hierarchy) 里面有2个重要的字段 *private transient ActionQueue actionQueue;                       ----行动队列(标记数据活动) *private transient StatefulPersistenceContext persistenceContext;----持久化上下文  当session的save()方法持久化一个对象时该对象被载入缓存以后即使程序中不再引用该对象只要缓存不清空该对象仍然处于生命周期中。当试图get()、 load()对象时会判断缓存中是否存在该对象有则返回此时不查询数据库。没有再查询数据库 Session 能够在某些时间点, 按照缓存中对象的变化来执行相关的 SQL 语句, 来同步更新数据库, 这一过程被称为刷出缓存(flush) *  Transaction的commit *  应用程序执行一些查询操作时 *  调用Session的flush()方法 ①验证一级缓存的存在 Book book (Book) session.get(Book.class,1);// 第一次查询缓存中没有 System.out.println(book);   Book book2 (Book) session.get(Book.class,1);// 因为第一次查询对象已经被放入1级缓存不会查询数据 System.out.println(book2);   *生成一条SQL语句返回同一个对象第一次查询生成SQL查询对象将对象放入一级缓存第二次查询直接从一级缓存获得 ②测试Hibernate快照 (深入理解一级缓存内存结构原理) hibernate 向一级缓存放入数据时同时保存快照数据(数据库备份)当修改一级缓存数据在flush操作时对比缓存和快照如果不一致自动更新(将缓存的内容同步到数据库更新快照) *  快照区使用在Session 保存一份与数据库相同的数据在session的flush时 通过快照区比较得知一级缓存数据是否改变如果改变执行对应操作update /** * 测试快照区的使用   */ Test publicvoid demo3(){     // 获得Session Session session HibernateUtils.openSession(); // 开启事务 Transaction transaction session.beginTransaction();   // 查询id 为1 的图书对象 Book book (Book) session.get(Book.class,1);// 第一次查询将对象加入一级缓存 System.out.println(book);   book.setName(深入浅出Hibernate技术);// 修改书名一级缓存被修改自动update   // 没有手动执行update因为快照区原因自动更新   // 提交事务关闭Session transaction.commit(); session.close(); } 使用Debug模式进行截图说明 我们重点关注session中的2个属性actionQueue和persistenceContext 大白话解析 **当执行get后缓存里面有数据了活动队列没有发生变化说明没有需要提交到数据的内容而PersistenceContext里面有内容了。 我们说持久化上下文里面存放的是一个Map它的键为一级缓存对象值为快照(它是一级缓存对象的一个副本)。 **当执行setName后一级缓存里面的数据发生了改变在缓存flush时会对比缓存和快照如果不一致那么会将缓存中的内容同步到数据库并更新快照 *  Hibernate中 持久态 对象具有自动更新数据库能力 持久态对象 才保存在 Session中才有快照 2.一级缓存常见操作 所有操作需要使用断点调试才能看得比较清楚 1)flush 修改一级缓存数据针对内存操作需要在session执行flush操作时将缓存变化同步到数据库 * 只有在缓存数据与快照区不同时生成update语句     2)clear 清除所有对象 一级缓存 3)evict 清除一级缓存指定对象 4)refresh 重新查询数据库更新快照和一级缓存 Test // Session 对于 一级缓存操作 publicvoid demo4(){ // 获得Session Session session HibernateUtils.openSession(); // 开启事务 Transaction transaction session.beginTransaction();   // 查询id 为1 的图书对象 Book book (Book) session.get(Book.class,1);// 第一次查询将对象加入一级缓存 System.out.println(book);   // book.setPrice(80d); // 修改一级缓存数据 // 将缓存内容同步到数据库 // session.flush();   // 清除一级缓存所有数据 // session.clear();   // 清除一级缓存中 指定对象 // session.evict(book);   book.setPrice(30d);// 一级缓存改变 session.refresh(book);// 用数据库内容 覆盖快照区和一级缓存   // 提交事务关闭Session transaction.commit(); session.close(); } 3.一级缓存刷出时间点设置 FlushMode ALWAYS 在每次查询时session都会flush  不要求 AUTO   : 在有些查询时session会flush  默认  ---------- 查询、commit 、session.flush COMMIT : 在事务提交时session会flush   ------- commit 、session.flush MANUAL 只有手动调用  session.flush 才会刷出  ----  session.flush 刷出条件(时间点严格程度 ) MANUAL COMMIT AUTO ALWAYS Test // 理解 FlushMode作用 publicvoid demo5(){ // 获得Session Session session HibernateUtils.openSession();   // 设置 flushMode session.setFlushMode(FlushMode.MANUAL);   // 开启事务 Transaction transaction session.beginTransaction();   // 查询id 为1 的图书对象 Book book (Book) session.get(Book.class,1);// 第一次查询将对象加入一级缓存 System.out.println(book);   book.setPrice(1000d);// 修改价格   session.createQuery(from Book).list();// 查询所有图书 AUTO 级别 flush   // 提交事务关闭Session transaction.commit();// (COMMIT 级别 flush)   // session.flush(); // MANUAL 级别 flush   session.close(); } 4.session持久化对象操作方法 1) save 将数据保存到数据库 将瞬时对象转换持久对象  持久化对象不允许随便修改 OID 2) update 更新数据 主要用于脱管对象的更新持久对象可以根据快照自动更新 将脱管对象转换持久对象         Test // 脱管对象更新 publicvoid demo6(){ // 获得Session Session session HibernateUtils.openSession(); // 开启事务 Transaction transaction session.beginTransaction();   Book book newBook();// 瞬时 book.setId(1);// 脱管 book.setName(java入门); book.setPrice(40d);   session.update(book);// 持久   session.flush();   // book.setPrice(50d);   // 提交事务关闭Session transaction.commit(); session.close(); } 问题一 调用update默认直接生成update语句如果数据没有改变不希望生成update 在hbm文件 class元素 添加 select-before-updatetrue classnamecn.itcast.domain.firstcache.Booktablebookcataloghibernate3day2select-before-updatetrue 问题二 当update脱管对象变为持久对象 一级缓存不允许出现相同OID 两个持久对象 Test // 一级缓存 存在两个相同OID 持久态对象 报错 publicvoid demo7(){ // 获得Session Session session HibernateUtils.openSession(); // 开启事务 Transaction transaction session.beginTransaction();   // 查询 // Book b (Book) session.get(Book.class, 1); // 持久   Book book newBook();// 瞬时 book.setId(1);// 脱管 book.setName(java入门); book.setPrice(50d); session.update(book);// 持久   // 提交事务关闭Session transaction.commit(); session.close(); } org.hibernate.NonUniqueObjectException: a different object with the same identifier value was already associated with the session: [cn.itcast.domain.firstcache.Book#1] 问题三 脱管对象 OID 在数据表中不存在update时发生异常 org.hibernate.StaleObjectStateException: Row was updated or deleted by another transaction (or unsaved-value mapping was incorrect): [cn.itcast.domain.firstcache.Book#20] 3) saveOrUpdate , 如果参数是一个瞬时对象执行save 如果参数是一个脱管对象执行update 如果参数是持久对象直接返回 判断对象是瞬时对象 OID为null 在hbm文件中为 id元素指定 unsaved-value属性如果PO对象OID为 unsaved-value 也是瞬时对象 id nameid unsaved-value-1  如果对象 OID为-1 也是瞬时对象此时执行的是save操作 Test // PO对象OID为 hbm文件 配置 unsaved-value 也是瞬时对象 saveOrUpdate 执行 save操作 publicvoid demo8(){ // 获得Session Session session HibernateUtils.openSession(); // 开启事务 Transaction transaction session.beginTransaction();   Book book newBook();// 瞬时 book.setId(-1);// 存在OID , -1是unsaved-value 也是瞬时 book.setName(xxx); book.setPrice(100d);   session.saveOrUpdate(book);   // 提交事务关闭Session transaction.commit(); session.close(); } 4) get/load 如果查询OID不存在 get方法返回 null load 方法返回代理对象 代理对象初始化时抛出 ObjectNotFoundException 5) delete 方法既可以删除一个脱管对象, 也可以删除一个持久化对象 **如果删除脱管先将脱管对象 与 Session 关联然后再删除 **执行delete先删除一级缓存数据在session.flush 操作时删除数据表中数据 Hibernate二级缓存相关问题 1.二级缓存的相关介绍 缓存好处 将数据库或者硬盘数据保存在内存中减少数据库查询次数减少硬盘交互提高检索效率     hibernate 共有两个级别的缓存         * 一级缓存保存Session中 事务范围的缓存         * 二级缓存保存SessionFactory 进程范围的缓存     SessionFacoty 两部分缓存     内置 Hibernate 自带的, 不可卸载. 通常在 Hibernate 的初始化阶段, Hibernate 会把映射元数据和预定义的 SQL 语句放到 SessionFactory 的缓存中, 映射元数据是映射文件中数据的复制, 而预定义 SQL 语句时 Hibernate 根据映射元数据推到出来的. 该内置缓存是只读的.       外置 一个可配置的缓存插件. 在默认情况下, SessionFactory 不会启用这个缓存插件. 外置缓存中的数据是数据库数据的复制, 外置缓存的物理介质可以是内存或硬盘必须引入第三方缓存插件才能使用。 2.二级缓存的内部结构以及存储特点 Hibernate二级缓存分为    * 类缓存区域 * 集合缓存区域     * 更新时间戳区域     * 查询缓存区域 类缓存区数据存储特点 * 从二级缓存区返回数据每次地址都是不同的散装数据 。每次查询二级缓存都是将散装数据构造为一个新的对象 集合缓存区 如果注释掉 Order类缓存orders 集合无法缓存 * 集合缓存区数据缓存依赖类缓存区数据缓存   ** 一级缓存的操作会同步到二级缓存 更新时间戳区域 作用记录数据最后更新时间确保缓存数据是有效的     Hibernate 提供了和查询相关的缓存区域: **时间戳缓存区域: org.hibernate.cahce.UpdateTimestampCache     时间戳缓存区域存放了对于查询结果相关的表进行插入, 更新或删除操作的时间戳.  Hibernate 通过时间戳缓存区域来判断被缓存的查询结果是否过期, 其运行过程如下:     T1 时刻执行查询操作, 把查询结果存放在 QueryCache 区域, 记录该区域的时间戳为 T1     T2 时刻对查询结果相关的表进行更新操作, Hibernate 把 T2 时刻存放在 UpdateTimestampCache 区域.     T3 时刻执行查询结果前, 先比较 QueryCache 区域的时间戳和 UpdateTimestampCache 区域的时间戳, 若 T2 T1, 那么就丢弃原先存放在 QueryCache 区域的查询结果, 重新到数据库中查询数据, 再把结果存放到 QueryCache 区域; 若 T2 T1, 直接从 QueryCache 中获得查询结果。 **更新时间戳区域记录数据最后更新时间在使用二级缓存时比较缓存时间t1 与更新时间 t2  如果 t2 t1 丢弃原来缓存数据重新查询缓存 查询缓存 有人称查询缓存 为hibernate 第三级缓存 * 二级缓存缓存数据都是类对象数据数据都是缓存在 类缓存区域 二级缓存缓存PO类对象条件(key)是id     查询缓存适用场合         **应用程序运行时经常使用查询语句         **很少对与查询语句检索到的数据进行插入, 删除和更新操作     如果查询条件不是id查询 缓存数据不是PO类完整对象 不适合使用二级缓存 查询缓存 缓存的是查询数据结果 key是查询生成SQL语句  查询缓存比二级缓存功能更加强大 适用查询缓存的步骤 1)配置二级缓存(查询缓存依赖二级缓存)     2)启用查询缓存 hibernate.cfg.xml   property namehibernate.cache.use_query_cachetrue/property 3)必须在程序中指定使用查询缓存   query.setCacheable(true); 3.二级缓存的并发策略     transactional  提供Repeatable Read事务隔离级别缓存支持事务发生异常的时候缓存也能够回滚     read-write     提供Read Committed事务隔离级别更新缓存的时候会锁定缓存中的数据     nonstrict-read-write 导致脏读 很少使用     read-only      数据不允许修改只能查询 * 很少被修改不是很重要允许偶尔的并发问题 适合放入二级缓存。考虑因素二级缓存的监控【后面学习】它是是否采用二级缓存主要参考指标 4.Hibernate支持哪些二级缓存技术 *  EHCache  (主要学习支持本地缓存支持分布式缓存) 可作为进程范围内的缓存, 存放数据的物理介质可以是内存或硬盘, 对 Hibernate 的查询缓存提供了支持。     *  OSCache         可作为进程范围内的缓存, 存放数据的物理介质可以是内存或硬盘, 提供了丰富的缓存数据过期策略, 对 Hibernate 的查询缓存提供了支持     *  SwarmCache         可作为集群范围内的缓存, 但不支持 Hibernate 的查询缓存     *  JBossCache         可作为集群范围内的缓存, 支持 Hibernate 的查询缓存 转载于:https://www.cnblogs.com/Jansens520/p/7845347.html
http://www.sadfv.cn/news/33011/

相关文章:

  • 大良网站设计架设销售网站
  • 学校网站功能描述被墙网站怎么做301跳转
  • 做同城网站还有机会吗广州网站优化价格
  • 网站的导航栏设计文本怎么做网页作业
  • 个人备案的公司网站域名交易网站建设
  • 文案撰写网站北京网络公司哪家最好
  • 口腔网站模板网站技术方案说明
  • 长裕建设有限公司网站网站重定向
  • 与通信工程专业做项目的网站rails开发的网站开发
  • 专业做网站方案赣州优化公司
  • 嘉兴备案网站建设做网站按钮
  • 陇南网站建设移动网站开发视频怎样嵌入
  • 查公司的网站有哪些英文网站建设方案 ppt模板
  • 漳州模板网站建设宿迁哪里做网站
  • 电商网站开发多少钱弄美团网站的一般一个做赚多少钱
  • 免费网站安全检测搜索引擎营销方法
  • 网站开发工资有多少开源cms建站
  • 网站改进建议贵阳市做网站公司
  • 网站建设是什么职位seo分析报告
  • 网站如何做才容易被搜索到网业协同心得体会运营商
  • 备案 网站名字美工模板网站
  • 网站建设需要的服务器虚拟主机怎么发布网站
  • 建设公司网站都需要什么软件开发培训思摩特
  • 甘井子区城市建设管理局网站制作个人网站要多少钱
  • 北京中交建设工程咨询有限公司网站用服务器建立网站教程
  • 营销型网站建设细节精选网页设计
  • 如何做明星的个人网站网易企业邮箱手机端设置
  • 云奇网站建设海外网站的建设
  • 河北先进网站建设风格投标网站建设
  • 现在网站建设用什么软件wordpress 订单系统