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"/>来建立表
相关推荐
以上就是Hibernate核心开发接口的简要介绍。在实际开发中,通过熟练掌握这些接口和概念,我们可以高效地利用Hibernate进行数据库操作,降低系统的耦合度,提升开发效率。通过阅读给出的源码s2sh_Hibernate03_CoreAPI...
通过对这些接口的学习和掌握,开发者可以更好地利用 Hibernate 来简化 Java 应用程序与数据库之间的交互,提高开发效率并降低维护成本。在实际项目中,合理运用这些接口可以帮助开发者构建出更加健壮和高效的系统。
**标题:“Hibernate核心jar包”** 在Java世界中,Hibernate是一个流行的对象关系映射(ORM)框架,它简化了数据库操作,将Java对象与数据库表之间的交互转化为简单的API调用。核心jar包是Hibernate框架的基础,...
4. **Session接口**:Session是Hibernate的工作单元,它实现了对数据库的基本操作,如增删改查。Session内部管理着一级缓存,用于提高性能。 5. **Criteria查询**:除了HQL(Hibernate Query Language)外,...
总结,这个压缩包包含了Hibernate开发所需的全部jar包,包括Hibernate核心库、JTA事务管理、JPA规范实现等,使用这些jar包,开发者可以轻松实现Java项目中的ORM功能,利用Hibernate的强大功能进行数据库操作,同时...
3. **Hibernate核心组件**:包括Session接口、SessionFactory、Entity、Criteria API等,这些都是Hibernate框架的核心组成部分,用于实现对象的持久化。 4. **映射机制**:Hibernate使用XML或注解的方式定义对象与...
本篇将深入探讨Hibernate的五个核心接口:Session、SessionFactory、Transaction、Query和Configuration。 1. **Session接口**: Session接口是Hibernate的核心接口之一,提供了对持久化对象的基本操作,包括创建...
下面将详细讲解Hibernate的核心代码及其相关知识点。 1. **配置文件**: Hibernate的核心配置文件是`hibernate.cfg.xml`,其中包含了数据库连接信息、方言设置、缓存配置等。例如: ```xml <hibernate-...
3. **Hibernate核心jar包**:主要包含以下组件: - **hibernate-core.jar**:这是Hibernate的基础库,包含了所有核心功能,如实体管理、session工厂、缓存管理等。 - **hibernate-entitymanager.jar**:提供了JPA...
《Hibernate核心类库详解》 Hibernate,作为Java领域中的一款著名对象关系映射(ORM)框架,极大地简化了数据库操作,使得开发者可以更加专注于业务逻辑而不是底层数据存储。本篇文章将详细探讨`hibernate-release-...
1. Session接口:它是Hibernate的主要工作接口,负责对象的持久化、检索、更新和删除。 2. Configuration类:配置Hibernate,加载并解析Hibernate配置文件,创建SessionFactory。 3. SessionFactory:创建Session...
总结,Hibernate作为强大的ORM框架,为Java开发者提供了便利,通过理解并熟练掌握其核心概念、配置和使用技巧,可以极大地提升开发效率,降低项目维护成本。结合黑马程序员的2016版教程,无论是初学者还是经验丰富的...
在这个压缩包中,包含的是用于开发的Hibernate核心库以及适用于MySQL数据库的驱动,同时整合了log4j日志框架,这些都是构建高效、稳定且可维护的JavaWeb应用的基础组件。 1. Hibernate 5.2:作为ORM框架的领导者,...
首先,我们需要理解Hibernate的核心概念——对象关系映射(ORM)。ORM是将数据库中的表映射到Java类的过程,使得开发者可以通过处理Java对象的方式来操作数据库,无需编写大量的SQL语句。Hibernate通过XML配置文件或...
4. **会话(Session)**:Hibernate的核心接口,它是操作数据库的主要入口,提供了事务管理、查询等功能。会话对象负责维护一个数据库连接,执行SQL语句,并管理对象的状态。 5. **查询语言(HQL)**:Hibernate...
【hibernate核心技术】主要涉及的是Java开发中的两个重要框架:Struts和Hibernate。这两个框架在企业级应用开发中有着广泛的应用,它们分别是MVC(Model-View-Controller)架构模式中的控制器和持久层解决方案。 ...
4. **Session与Transaction**:在Hibernate中,Session是与数据库交互的主要接口,而Transaction则负责管理事务。手册会解释Session的生命周期、查询操作、事务的提交与回滚,以及如何处理并发问题。 5. **HQL与...
本篇文章将深入探讨Hibernate 3.1.1和3.1.2版本的开发文档,为读者揭示其核心特性和使用方法。 一、Hibernate ORM基础 Hibernate的核心功能在于提供一个持久化层,将Java对象与数据库中的记录进行映射。通过XML配置...
在开发过程中,将这些“Hibernate 3.2核心包”添加到项目的lib目录,可以确保所有必要的库文件都已就绪,进而能够顺利地进行ORM开发。开发者可以根据具体需求,结合其他SSH组件,构建高效稳定的Java Web应用。