`
weigang.gao
  • 浏览: 491227 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

hibernate核心开发接口(4)

 
阅读更多

1.Configuration

      a)   使用annotation的时候,用AnnotationConfiguration

      b) 主要是进行配置信息管理

      c)   用来产生SessionFactory

      d )  可以在configure方法中指定hibernate配置文件love.xml   

  sessionFactory = new AnnotationConfiguration().configure("love.xml").buildSessionFactory();//读取src目录的下的love.xml文件

      e) 只需要关注一个方法即:buildSessionFactory

 

2.SessionFactoty里面管理了一系列的连接池,它用来产生Session,然后从池里面拿出一个connection挂到产生的Session上面

         a)  用来产生和管理Session

         b)通常情况下每个应用只需要一个SessionFactory

         C) 除非要访问多个数据库的情况

         D) 关注2个方法即:openSession getCurrentSession

 

区别:openSession与getCurrentSession的区别?

1.openSession:永远是打开新的Session,需要手动close。

2.getCurrentSession:如果Current Session Context中已经有了Session了,它就会拿当前环境中Session。如果没有,就打开新的Session并存放于Current Session Context中。

  a.getCurrentSession获取的Session会存放于Current Session Context中(在hibernate.cfg.xml可以设置Current Session Context是什么),而openSession不会

  b.getCurrentSession获取的Session提交后会自动close,所以当提交后再次getCurrentSession获取Session时,就不是同一个了

 

 

3.对象的三种状态

说明:当一个对象new出来的时候,它是Transient状态。当我们调用save()或saveOrUpdate()的时候,它就变成persistence状态,persistence状态时对象是有id的。当我们关闭session时,persistence状态的对象就会变成detached状态。

 

3.1.对象的三种状态的区分关键在于

       A)   内存有没有ID (在实际工作中,一般让数据库帮我生成id。但是数据库生成这个id,存在内存中的这个model有没有id呢?)

       B)   缓存中有没有ID(session缓存)

       C)   ID在数据库中有没有

对象的三种状态说明:

a.transient :在内存中new出来一个对象时,内存中没id,缓存中没有id,数据库中也没有id

b.persistence :数据库中有id,缓存中有id(hibernate一级缓存Session中会有),内存中也有id

c.detacted  :数据库中有id,缓存中没有id(hibernate一级缓存Session被清空了),内存中有id

示例代码说明:

@Test
	public void testStudentSave(){
		Student stu = new Student();//当new一个对象的时候,处于transient状态
		stu.setName("gaoweigang");
		stu.setAge(25);
		Session session = sessionFactory.getCurrentSession();
		session.beginTransaction();
		session.save(stu);//当save或saveOrUpdate完成后,处于persistence状态
		System.out.println(stu.getId());
		
		session.beginTransaction().commit();//当close完成后,处于detacted状态

		//session.close();因为我们使用的是getCurrentSession,所以就不必显示的关闭Session了
		
	}

图形说明:当save的时候


  

4.Session

     A) 管理一个数据库的任务单元,即session来帮我们管理数据库的增,删,改,查的操作

     B)方法(CRUD)

              I    save()

              Ii   delete()只要数据库中这条记录有id,就可以delete()。

             Iii   update()必须数据库中有这条记录才能update(),所以transient状态的对象不能update,因为数据库中还还没有这个对象的记录。update语句的发出在commit的时候

             Iv   save or update()

             V    load  获取的是一个代理类,这个代理类的父类是被代理类(Student),java使用javassist来直接生成二进制码代理类(也就是不会生成源码,再来编译)

             Vi   get

             Vii  get与load的区别

                    1.数据库中不存在对应记录时表现不一样

                    2.load还回的是代理对象,等到真正用到对象的内容是才发出sql语句

可以通过System.out.println(t.getClass());来证明t所引用的对象的类型不是Teacher类型的

 

                    3.get直接从数据库加载产生一个对象,不会延迟

可以通过System.out.println(t.getClass());来证明t所引用的对象类型是Teacher类型的

 

        viii  update

             1. 用来更新detached对象,更新完成后转为peisistent状态

             2.更新transient对象会报错

             3.更新自己指定id的transient对象可以( 前提数据库中要有该id的记录)

             4.persistent状态的对象(当一个persistent状态的对象,里面的值被改变的时候,如果跟原来值相同,那么hibernate就不会发update语句;如果跟原来值不同,hibernate就会发update语句,发的时候会将所有字段都更新)

说明:上面的1234虽然你只更改了部分字段,但是update的时候,会把所有字段update一边,这样的效率很低

             5.只更新更改过的字段(注意:只是在某些情况下,并不是所有情况下,看日志中打印出来sql就知道了)

                    A)第一种: xml设定property标签的update属性,annotation设定@Column的updatable属性(@Conlumn(updatable=false)放到方法上面),不过这种方式很少使用,因为不灵活

                    B)第二种:同一个Session里面可以,夸Session就不行了。在xml中Class上添加dynamic-update ,即<class name="com.bjsxt.model.Student" dynamic-update=”true”>,JPA1.0 Annotation没有对应的属性。

                    C)Hbernate扩展,使用merge同样会执行多余的动作,看日志就知道了

                          1.   同一个session可以,跨session不行,不过可以用merge()

(不重要)

                    D) 使用HQL(EJBQL)(建议)              

Session session = sessionFactory.getCurrentSession();
session.beginTransaction();
Student s = (Student) session.get(Student.class, 41);//当save或saveOrUpdate完成后,处于persistence状态
s.setAge(33);
session.beginTransaction().commit();//当close完成后,处于detacted状态

Session session2 = sessionFactory.getCurrentSession();
session2.beginTransaction();
//使用HQL,只会更新指定字段
Query("update Student s set s.name='小熊' where s.id = '41'");
query.executeUpdate();
System.out.println(s.getName());
session2.getTransaction().commit();

 

         vII .saveOrUpdate();

         vIII. Clear方法

              1.无论是load还是get,都会首先查找session级的缓存(一级缓存),如果没有,才会去数据库查找,调用clear()方法可以强制清除session缓存

         Ix. Flush方法

             1. 可以强制进行从缓存到数据库的同步,默认的情况下是commit的时候进行缓存到数据库的同步;当你进行commit()的时候,默认就进行了flush()

             2.具体在什么时间flush由flushMode决定,每个session都可以设定它的flushMode(flush的模式),所谓fushMode就是指在什么时间进行数据库的同步,flush的模式要在Transaction开始的时候进行设置eg:session.setFlushMode(FlushMode.ALWAYS)设置flush的模式为always,就是无论执行什么话都会进行flush一次;还可以设置为NEVER,表示无论执行什么话都不进行同步(不重要,了解)

 

6.SchemaExport作用:可以让你在程序里面控制生成建表语句

      <property name="hbm2ddl.auto">update</property>我们现在在数据库中建表用的是这个配置,而实际工作当中可以不用这个配置,不用这个配置的话数据库表不会自动生成,我们可以手动生成; 手动建表时,当执行到下面这条语句是才建表new  SchemaExport(new Configuration().configure()).create(true,true);

其中create第一个参数指定要不要在空中台中显示ddl语句,第二个参数指定建表语句要不要到数据库中执行。这句话会根据hibernate.cfg.xml中的

<mapping resource="com/bjsxt/hibernate/Teacher.hbm.xml"/>    

<mapping class="com.bjsxt.hibernate.model.Student"/>来建立表 

 

  • 大小: 25 KB
  • 大小: 19.1 KB
分享到:
评论

相关推荐

    Hibernate教程03_Hibernate核心开发接口介绍

    以上就是Hibernate核心开发接口的简要介绍。在实际开发中,通过熟练掌握这些接口和概念,我们可以高效地利用Hibernate进行数据库操作,降低系统的耦合度,提升开发效率。通过阅读给出的源码s2sh_Hibernate03_CoreAPI...

    hibernate中五个核心接口

    通过对这些接口的学习和掌握,开发者可以更好地利用 Hibernate 来简化 Java 应用程序与数据库之间的交互,提高开发效率并降低维护成本。在实际项目中,合理运用这些接口可以帮助开发者构建出更加健壮和高效的系统。

    hibernate核心jar包

    **标题:“Hibernate核心jar包”** 在Java世界中,Hibernate是一个流行的对象关系映射(ORM)框架,它简化了数据库操作,将Java对象与数据库表之间的交互转化为简单的API调用。核心jar包是Hibernate框架的基础,...

    hibernate_3.2官方开发包

    4. **Session接口**:Session是Hibernate的工作单元,它实现了对数据库的基本操作,如增删改查。Session内部管理着一级缓存,用于提高性能。 5. **Criteria查询**:除了HQL(Hibernate Query Language)外,...

    hibernate所有开发包

    总结,这个压缩包包含了Hibernate开发所需的全部jar包,包括Hibernate核心库、JTA事务管理、JPA规范实现等,使用这些jar包,开发者可以轻松实现Java项目中的ORM功能,利用Hibernate的强大功能进行数据库操作,同时...

    hibernate完整开发包

    3. **Hibernate核心组件**:包括Session接口、SessionFactory、Entity、Criteria API等,这些都是Hibernate框架的核心组成部分,用于实现对象的持久化。 4. **映射机制**:Hibernate使用XML或注解的方式定义对象与...

    J2EE企业级项目开发-3期(KC007) 5.3 探究Hibernate之核心接口文档.doc

    本篇将深入探讨Hibernate的五个核心接口:Session、SessionFactory、Transaction、Query和Configuration。 1. **Session接口**: Session接口是Hibernate的核心接口之一,提供了对持久化对象的基本操作,包括创建...

    hibernate核心代码

    下面将详细讲解Hibernate的核心代码及其相关知识点。 1. **配置文件**: Hibernate的核心配置文件是`hibernate.cfg.xml`,其中包含了数据库连接信息、方言设置、缓存配置等。例如: ```xml &lt;hibernate-...

    hibernate开发jar包

    3. **Hibernate核心jar包**:主要包含以下组件: - **hibernate-core.jar**:这是Hibernate的基础库,包含了所有核心功能,如实体管理、session工厂、缓存管理等。 - **hibernate-entitymanager.jar**:提供了JPA...

    Hibernate 核心类库

    《Hibernate核心类库详解》 Hibernate,作为Java领域中的一款著名对象关系映射(ORM)框架,极大地简化了数据库操作,使得开发者可以更加专注于业务逻辑而不是底层数据存储。本篇文章将详细探讨`hibernate-release-...

    hibernate 3.1 开发包 下载

    1. Session接口:它是Hibernate的主要工作接口,负责对象的持久化、检索、更新和删除。 2. Configuration类:配置Hibernate,加载并解析Hibernate配置文件,创建SessionFactory。 3. SessionFactory:创建Session...

    黑马程序员_hibernate框架开发2016版讲义和笔记资料_day1_day2_day3_day4

    总结,Hibernate作为强大的ORM框架,为Java开发者提供了便利,通过理解并熟练掌握其核心概念、配置和使用技巧,可以极大地提升开发效率,降低项目维护成本。结合黑马程序员的2016版教程,无论是初学者还是经验丰富的...

    hibernate开发核心5.2jar包 带mysql驱动

    在这个压缩包中,包含的是用于开发的Hibernate核心库以及适用于MySQL数据库的驱动,同时整合了log4j日志框架,这些都是构建高效、稳定且可维护的JavaWeb应用的基础组件。 1. Hibernate 5.2:作为ORM框架的领导者,...

    hibernate框架开发2016版视频 四天学习笔记完整版

    首先,我们需要理解Hibernate的核心概念——对象关系映射(ORM)。ORM是将数据库中的表映射到Java类的过程,使得开发者可以通过处理Java对象的方式来操作数据库,无需编写大量的SQL语句。Hibernate通过XML配置文件或...

    hibernate独立开发包

    4. **会话(Session)**:Hibernate的核心接口,它是操作数据库的主要入口,提供了事务管理、查询等功能。会话对象负责维护一个数据库连接,执行SQL语句,并管理对象的状态。 5. **查询语言(HQL)**:Hibernate...

    hibernate 核心技术

    【hibernate核心技术】主要涉及的是Java开发中的两个重要框架:Struts和Hibernate。这两个框架在企业级应用开发中有着广泛的应用,它们分别是MVC(Model-View-Controller)架构模式中的控制器和持久层解决方案。 ...

    hibernate中文开发手册

    4. **Session与Transaction**:在Hibernate中,Session是与数据库交互的主要接口,而Transaction则负责管理事务。手册会解释Session的生命周期、查询操作、事务的提交与回滚,以及如何处理并发问题。 5. **HQL与...

    hibernate 开发文档发布

    本篇文章将深入探讨Hibernate 3.1.1和3.1.2版本的开发文档,为读者揭示其核心特性和使用方法。 一、Hibernate ORM基础 Hibernate的核心功能在于提供一个持久化层,将Java对象与数据库中的记录进行映射。通过XML配置...

    Hibernate 3.2核心包

    在开发过程中,将这些“Hibernate 3.2核心包”添加到项目的lib目录,可以确保所有必要的库文件都已就绪,进而能够顺利地进行ORM开发。开发者可以根据具体需求,结合其他SSH组件,构建高效稳定的Java Web应用。

Global site tag (gtag.js) - Google Analytics