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

来源:互联网 发布:c语言中指针的作用 编辑:程序博客网 时间:2024/05/17 07:29

1.Configurationa.包括AnnotationConfigurationb.进行配置信息的管理c.用来产生SessionFactoryd.可以在configure方法中指定hibernate配置文件sessionFactory = new AnnotationConfiguration().configure("hibernate.xml").buildSessionFactory();//默认寻找hibernate.cfg.xmle.只需要关注一个方法:buildSessionFactory()SessionFactory产生一个session的时候,会分配一个连接给session

2.SessionFactorya.用来产生和管理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,对象变成transientiii.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:内存有,缓存没有,数据库有,有id4.SchemaExport 可以在程序里面控制生成建表语句new SchemaExport(new AnnotationConfiguration().configure()).create(true,true);//第一个true打印sql语句,第二个true到数据库执行sql效果相当于<property name="hbm2ddl.auto">update</property>5.Query接口



                                             
0 0
原创粉丝点击