08hibernate hibernate的核心开发接口介绍及三种对象状态(重点)
2014-07-03 10:37
411 查看
1.Configuration a.包括AnnotationConfiguration b.进行配置信息的管理 c.用来产生SessionFactory d.可以在configure方法中指定hibernate配置文件 sessionFactory = new AnnotationConfiguration().configure("hibernate.xml").buildSessionFactory(); //默认寻找hibernate.cfg.xml e.只需要关注一个方法:buildSessionFactory() SessionFactory产生一个session的时候,会分配一个连接给session
2.SessionFactory a.用来产生和管理session SessionFactory里面最重要的就是维护数据库连接池 b.通常情况下每个应用只需要一个SessionFactory,所以SessionFactory是单例 c.除非要访问多个数据库的情况 d.关注两个方法:openSession getCurrentSession 区别: Session session = SessionFactory.getCurrentSession(); //必须设定上下文,如果当前的上下文里没有session就创建,有的话就直接获取 //session一旦提交,再拿就是新的session //事务提交自动close //用途:界定事务边界 Session session = SessionFactory.openSession(); //永远是创建新的session //需要close 补充知识:什么叫“上下文”? <property name="current_session_context_class">thread</property> 上下文的取值: 1.jta(java transaction api,常用) 分布式事务(分布在多台不同的数据库服务器上)使用一个connection是不够的 是ApplicationServer提供的事务管理器,运行需要ApplicationServer的支持 2.thread(最常用)//当前线程 thread的事务就是数据库的单独连接,及一个connection,从数据库界定事务 3.managed(ApplicationServer手动管理,很少用) 4.custom.class 试验:先openSession(),再getCurrentSession(), 此处的两个session不是同一个,为什么? 原因:session是一个接口,而两个方法获取的session的具体实现类是不同的, 两者不能混用
<pre name="code" class="java">3.Session(重点) a.管理一个数据库的任务单元 b.方法(CRUD) i. save() save()方法的实质: new一个对象之后,先在内存的session对象产生一个引用指向该对象 此时session中就保存了对象,事务提交后就保存在数据库中了 ii. delete() 缓存里也就没有了,操作的对象必须有id,对象变成transient iii.update() 1.用来更新detached对象,更新完成后转为persistent状态 2.更新transient对象会报错 3.更新自己设定id的transient对象可以(数据库有对应记录) 4.persistent状态对象只要设定不同字段就会发生更新 5.更新部分更改的字段 a.xml设定property标签的update=true|false, annotation设定@Column(updatable=false),很少用,不灵活 b.使用xml中的dynamic-update="true",JPA1.0 Annotation没有对应的属性 //同一个session可以,跨session不行, //不过可以用merge(),意思是合并(不重要) c.建议使用HQL //Query q = session.createQuert("update Student s set s.name = 1"); //q.executeUpdate(); iv. saveOrUpdate() v. load()//如:Teacher t = (Teacher)session.load(Teacher.class,1); //1是id,类型为Integer,所有实现了序列化 //此时t是persistent状态的 vi. get()//Teacher t = (Teacher)session.get(Teacher.class,1); vii.find方法已经过时 viii.get与load的区别(重点) 1.不存在对应记录时,两者表现不一样, load不会报错(因为没有发出sql语句),而get会报错 2.load返回的是代理对象,等到真正用到对象的内容时才发出sql语句 是不是代理对象可以通过t.getClass()方法来检测 3.get直接从数据库加载,不会延迟 ix. clear方法 //无论是load还是get,都会首先查找缓存(一级缓存), //如果没有,才会去数据库查找 //调用clear()方法可以强制清除session缓存 x. 调用flush()方法 1.强制进行从内存到数据库的同步,默认提交的时候同步 2.可以通过设置flushMode来选择flush的时机 //session.setFlushMode(FlushMode.AUTO) 必备知识点: 对象的三种状态 1.对象的三种状态图解(见下图) 2.三种状态的区分关键在于: a.有没有ID(没有id,一定是Transient) b.ID在数据库中有没有 c.在内存中有没有(session缓存) //缓存:放在内存中的,可以提高访问效率的数据 //个人理解1:一级缓存一定存在于session中,一旦session关闭就不存在一级缓存 //个人理解2:不同session获取数据库的同一个数据所得到的对象不是同一个, //因此在各自的session中的持久化状态就不同 3.三种对象: a.transient:内存中有一个对象,没有id,缓存中也没有 b.persistent:内存中有,缓存中有,数据库有(id) c.detached:内存有,缓存没有,数据库有,有id 4.SchemaExport 可以在程序里面控制生成建表语句 new SchemaExport(new AnnotationConfiguration().configure()).create(true,true); //第一个true打印sql语句,第二个true到数据库执行sql 效果相当于<property name="hbm2ddl.auto">update</property> 5.Query接口
相关文章推荐
- Hibernate学习笔记(四)----核心开发接口、对象的三种状态、session常用方法
- HIbernate学习笔记(二) hibernate对象的三种状态与核心开发接口
- hibernate(五)核心开发接口与对象的三种状态
- Hibernate之核心开发接口与对象的三种状态
- Hibernate 核心接口 三种对象状态 四种操作方法
- Hibernate的原理体系架构,五大核心接口,Hibernate对象的三种状态转换,事务管理
- Hibernate的原理体系架构,五大核心接口,Hibernate对象的三种状态转换,事务管理
- hibernate---核心开发接口介绍(重点)
- Hibernate之三几个核心类和对象的三种状态
- JDBC概念,JDBC核心类(接口)和对象介绍
- 【Hibernate框架开发之五】Hibernate对象的三种状态&Session常用方法
- hibernate---核心API-JTA/对象的三种状态
- 面向对象开发中的核心思想和概念-接口与抽象
- HIBERNATE核心开发接口介绍
- Hibernate教程03_Hibernate核心开发接口介绍
- hibernate---核心开发接口1(重点)
- 使用SteamVR Plugins插件为基础,来介绍Vive开发的入门,重点讲解设备的激活和控制接口
- hibernate---核心开发接口1(重点)
- 【Hibernate框架开发之五】Hibernate对象的三种状态&&Session的常用方法