08hibernate hibernate的核心开发接口介绍及三种对象状态(重点)

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接口

 


 

                
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值