Hibernate学习笔记2.5(Hibernate核心开发接口和三种状态)
1.configuration(配置信息管理,产生sessionfactory)

sessionfactory管理一系列的连接池
opensession 永远打开新的,需要手动close
getcurrentsession如果当前环境有,就会用已经存在的,没有就创建新的
一旦提交就没了
getcurrentsession主要用于界定事务边界,事务提交自动close
上下文:在hibernate.cfg.xml里面改 currentsession_context_class
thread:线程 当前线程有没有一个对象,没有就创建i新的,使用connection
jta: 分布式事务 ,Java tarsaction api多数由中间键服务器提供 Tomcat不具备该能力
manager:手动管理事务
custormclass:自己定义
如果使用getcurrentsession必须设定上下文环境
geucurrentsession和sessionopen拿到的类 具体实现可能不一样 因此一般情况下 不建议混用
如果址用hibernate 就要写trycatch
用spring的话就不用写try catch
save();设定一个主键,id
首先搞懂三种状态

三种状态
transient :内存中的一个对象 缓存中没有对应的id和value
Persistent:内存中有 缓存中有 数据库有 有id
Datached: 内存有 缓存没有 数据库有 有id
save方法即是把transient转化为Persisitence
delete方法
Load
@Test
public void testLoad() { Session session = sessionFactory.getCurrentSession();
session.beginTransaction();
Teacher t = (Teacher)session.load(Teacher.class, ); session.getTransaction().commit();
System.out.println(t.getClass());
//System.out.println(t.getName());
}
1,自动打包为intege 实现了序列化接口
get
@Test
public void testGet() { Session session = sessionFactory.getCurrentSession();
session.beginTransaction();
Teacher t = (Teacher)session.get(Teacher.class, ); session.getTransaction().commit();
System.out.println(t.getClass());
//System.out.println(t.getName());
}
用load拿出东西的时候才会发出sql语句,不存在对应记录不拿东西不会报错,返回代理对象()
用get拿出对象的时候是直接在数据库加载,不存在对应记录不拿东西也会报错
update
第一种 有detach到persistence 同时数据库更新
@Test
public void testUpdate1() { Session session = sessionFactory.getCurrentSession();
session.beginTransaction();
Teacher t = (Teacher)session.get(Teacher.class, ); session.getTransaction().commit(); t.setName("zhanglaoshi"); Session session2 = sessionFactory.getCurrentSession();
session2.beginTransaction();
session2.update(t); session2.getTransaction().commit();
}
更新trasent会报错
如果transent设置id数据库并且存在
数据库得有对应的记录
@Test
public void testUpdate2() { Teacher t = new Teacher();
t.setName("zhanglaoshi"); Session session2 = sessionFactory.getCurrentSession();
session2.beginTransaction();
session2.update(t); session2.getTransaction().commit();
}
如果有一个字段特别长 全改就会变低

Load的时候自动会检查缓存是否与数据库一致 如果不一致 就会发update语句 ,所有字段均会更新,如果相同,不会更改
@Test
public void testUpdate4() { Session session = sessionFactory.getCurrentSession();
session.beginTransaction();
Teacher t = (Teacher)session.get(Teacher.class, );
t.setName("zhangsan2");
session.getTransaction().commit();
}
想要只更改一条想要更改的内容
1.加注解(很少用 不够灵活)
anntation
@Column(updatable = false)
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
xml:
property属性 update 设置true或者false
2.在xml配置文件上写
<hibernate-mapping>
<class name="com.bjsxt.hibernate.Student" dynamic-update="true">
设置之后在同一个session之后就只更新只更改改的那一部分
跨session的话
@Test
public void testUpdate5() { Session session = sessionFactory.getCurrentSession();
session.beginTransaction();
Student s = (Student)session.get(Student.class, );
s.setName("zhangsan5");
session.getTransaction().commit(); s.setName("z4"); Session session2 = sessionFactory.getCurrentSession();
session2.beginTransaction();
session2.update(s);
session2.getTransaction().commit();
}
他会全部发送,全部更改
如果想要跨session,可以使用merge方法
@Test
public void testUpdate6() { Session session = sessionFactory.getCurrentSession();
session.beginTransaction();
Student s = (Student)session.get(Student.class, );
s.setName("zhangsan6");
session.getTransaction().commit(); s.setName("z4"); Session session2 = sessionFactory.getCurrentSession();
session2.beginTransaction();
session2.merge(s);
session2.getTransaction().commit();
}
在update之前会先搜索一下 比较是否相同
3.使用hql语句
@Test
public void testUpdate7() { Session session = sessionFactory.getCurrentSession();
session.beginTransaction();
Query q = session.createQuery("update Student s set s.name='z5' where s.id = 1");
q.executeUpdate();
session.getTransaction().commit(); }

Save or update
@Test
public void testSaveOrUpdate() { Teacher t = new Teacher();
t.setName("t1");
t.setTitle("middle");
t.setBirthDate(new Date()); Session session = sessionFactory.getCurrentSession();
session.beginTransaction();
session.saveOrUpdate(t); session.getTransaction().commit(); t.setName("t2"); Session session2 = sessionFactory.getCurrentSession();
session2.beginTransaction();
session2.saveOrUpdate(t);
session2.getTransaction().commit(); }
没id就save 有id就update
Clear方法
@Test
public void testClear() { Session session = sessionFactory.getCurrentSession();
session.beginTransaction();
Teacher t = (Teacher)session.load(Teacher.class, );
System.out.println(t.getName()); //first session.clear(); Teacher t2 = (Teacher)session.load(Teacher.class, ); //second
System.out.println(t2.getName());
session.getTransaction().commit();
clear用于清除缓存,load和get方法都会先查找缓存,有的话就不会发sql语句
Flush
@Test
public void testFlush() { Session session = sessionFactory.getCurrentSession();
session.beginTransaction();
Teacher t = (Teacher)session.load(Teacher.class, );
t.setName("tttt"); t.setName("ttttt"); session.getTransaction().commit(); }
如果不加flush的话 他永远只取一次,取最后的
@Test
public void testFlush() { Session session = sessionFactory.getCurrentSession();
session.beginTransaction();
Teacher t = (Teacher)session.load(Teacher.class, );
t.setName("tttt"); session.flush(); t.setName("ttttt"); session.getTransaction().commit(); }
加了flush之后可以强制缓存的内容与数据库的内容做同步
commit方法默认执行flush
在什么时间执行flush由flushmode控制
在前面设置 session.setFlushMode(FlushMode.xxxx)
find方法很老 现在也不怎么用了
SkemaExport
@Test
public void testSchemaExport() {
new SchemaExport(new AnnotationConfiguration().configure()).create(false, true);
}
控制建表语句
Hibernate学习笔记2.5(Hibernate核心开发接口和三种状态)的更多相关文章
- Hibernate学习笔记二:Hibernate缓存策略详解
一:为什么使用Hibernate缓存: Hibernate是一个持久层框架,经常访问物理数据库. 为了降低应用程序访问物理数据库的频次,从而提高应用程序的性能. 缓存内的数据是对物理数据源的复制,应用 ...
- Hibernate学习笔记五:反向工程快速开发
转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6768513.html 一:反向工程 Myeclipse提供由 数据库表 生成 java pojo 和 hib ...
- Hibernate学习笔记--第一个Hibernate框架程序
一般使用集成开发环境是,把所需的类库添加到项目属性的库路径中,开发工具在部署时会自动复制所需要的类包到WEB-INF\lib目录下 MyEclipse中: 创建项目,右击项目->myeclips ...
- C语言学习笔记 (006) - 二维数组传参的三种表现形式
# include <stdio.h> # include <stdlib.h> # define M # define N int getdate(int (*sp)[M]) ...
- Swift 学习笔记 (解决Swift闭包中循环引用的三种方法)
话不多说 直接上代码 class SmartAirConditioner { var temperature:Int = //类引用了函数 var temperatureChange:((Int)-& ...
- Hibernate学习笔记(二)—— 实体规则&对象的状态&一级缓存
一.持久化类 1.1 什么是持久化类? Hibernate是持久层的ORM映射框架,专注于数据的持久化工作.所谓的持久化,就是将内存中的数据永久存储到关系型数据库中.那么知道了什么是持久化,什么又是持 ...
- HIbernate学习笔记(二) hibernate对象的三种状态与核心开发接口
1.在hibernate中持久化对象有三个状态,这个面试时可能会问到: (1)transient瞬时态:在数据库中没有与之匹配的数据,一般就是只new出了这个对象,并且在session缓存中也没有即此 ...
- Spring MVC 学习笔记12 —— SpringMVC+Hibernate开发(1)依赖包搭建
Spring MVC 学习笔记12 -- SpringMVC+Hibernate开发(1)依赖包搭建 用Hibernate帮助建立SpringMVC与数据库之间的联系,通过配置DAO层,Service ...
- Hibernate学习笔记(二)
2016/4/22 23:19:44 Hibernate学习笔记(二) 1.1 Hibernate的持久化类状态 1.1.1 Hibernate的持久化类状态 持久化:就是一个实体类与数据库表建立了映 ...
随机推荐
- Kafka分布式集群部署
这个是kafka的官网地址:http://kafka.apache.org/ 1.kafka是一个消息系统. 2.kafka对流数据可以高效的实时处理. 3.分布式集群的环境下能够保证数据的安全. k ...
- vs2017配置文件目录
C:\Users\Administrator\AppData\Local\Microsoft\VisualStudio\15.0_6d0a0a42
- es6(9)--Symbol
//Symbol生成一个独一无二的值,生成的值不会相等 { //声明1 let a1=Symbol(); let a2=Symbol(); console.log(a1===a2);//false / ...
- Postgresql ERROR: permission denied for relation app_info
启用终端,: 进入mydb数据库:\c mydb 然后给当前数据库的角色赋予权限:GRANT ALL PRIVILEGES ON TABLE 表名 TO 角色名;
- centos7 jdk
查看已经自带的jdk: rpm -qa | grep jdk 卸载 sudo yum remove XXX 1.下载 jdk-8u101-linux-x64.rpm http://www.orac ...
- Java 递归详解
递归详解: 1.递归一句话通俗讲就是一个方法自动重复调用自己的过程. 2.因为是重复调用自己了,所以看起来像一个循环,所以为了避免内存溢出系统崩溃,我们需要在方法里加一个返回值判断,用于递归循环的跳出 ...
- iOS如何把所有页面状态栏的字体颜色都设置为白色
第一步:在info.plist中添加一个字段:view controller -base status bar 设置为NO 第二步:在一个所有界面都继承的父类里添加: if (IOS7_OR_LATE ...
- uva-141-枚举
旋转过程的下标变化,画个2x2的表格,模拟就可以出来了 #include <string> #include<iostream> #include<map> #in ...
- python中的find、rfind、index、rindex
find()从左向右寻找子序列的位置,如存在多个相同子序列只返回第一个查找到的位置,如果子序列不存在返回-1 rfind()从右向左寻找子序列的位置..... index()从左向右寻找子序列的位置, ...
- 完美解决ubuntu下sublime中文输入问题
声明 1.本人整理文章,转载请注明出处. 2.参考资料 http://my.oschina.net/tsl0922/blog/113495 问题描述 在ubuntu下想使用sublime,但是不能输入 ...