Hibernate 再接触 核心开发接口
1.可以重载方法进行配置文件的指定
sessionFactory = new AnnotationConfiguration().configure("hibernate.xml").buildSessionFactory();
这样读取到的就是hibernate.xml 但一般不建议修改
getcurrentsession 指的是上下文如果没有提交 就不会创建新的session
opensession 永远打开新的session 用于鉴定事务边界 比如加入日志操作等
事务:要么同时完成,要么就回滚
<property name="current_session_context_class">thread</property>
从当前线程里找
还有其他几个参数:
例如 jta ,managed,custorm.class等
thread使用数据库链接作为事务管理
但是管理不了分布式事务
jta(java trasaction api) 往往用在分布式上
需要一个manager管理对部署在两个数据库的操作
如果不设上下文他就无法找到
opensession尽量不要跟getcurrentsession同用 不是同一个session
缓存就是内存中的一块区域 放着我们想要提高读取效率的对象
对象的三种状态
Transient persistent detached
Transient 内存有一个对象 但是没有id 缓存中也没有 数据库也没有
persistent 内存有 缓存中有 数据库有 也有id session里有key和value
detached 内存有 缓存没有 数据库有
三种状态区分在于:
有没有id
id在数据库中有没有
在内存中没有(session缓存)
session 管理一个数据库的任务单元 管理增删改查的操作
save 略
delete
只要有id 包括detach态 就可以delete
例如:
@Test
public void testDelete() { Teacher t = new Teacher();
t.setName("t1");
t.setTitle("middle");
t.setBirthDate(new Date()); Session session = sessionFactory.getCurrentSession();
session.beginTransaction();
session.save(t);
System.out.println(t.getId());
session.getTransaction().commit(); Session session2 = sessionFactory.getCurrentSession();
session2.beginTransaction();
session2.delete(t);
session2.getTransaction().commit();
} @Test
public void testDelete2() { Teacher t = new Teacher();
t.setId(); Session session2 = sessionFactory.getCurrentSession();
session2.beginTransaction();
session2.delete(t);
session2.getTransaction().commit();
}
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 是可以自动打包
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());
}
两者区别:
需要注意的是 get 和load方法有重要区别 load种 是生成一个代理 当真正想使用对象的属性的时候才会发出sql语句 而get是马上就发
update
更新detach的一个对象
@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();
}
更新transient 会报错 但是更新有id的transient不会报错 (数据库有对应记录)
@Test
public void testUpdate4() { Session session = sessionFactory.getCurrentSession();
session.beginTransaction();
Teacher t = (Teacher)session.get(Teacher.class, );
t.setName("zhangsan2");
session.getTransaction().commit();
}
以上的更新会更新所有字段 为提高效率 所以摸索
如何只改想要的字段
如果是p对象 只要设置字段 就会发生更新
@Test
public void testUpdate5() { Session session = sessionFactory.getCurrentSession();
session.beginTransaction();
Student s = (Student)session.get(Student.class, );
s.setName("zhangsan5");
session.getTransaction().commit(); //发现对象与数据库中不同 自动update s.setName("z4"); Session session2 = sessionFactory.getCurrentSession();
session2.beginTransaction();
session2.update(s);
session2.getTransaction().commit();
}
但是这种更新还是全部的
要想实现只更新想要更新的字段
有三种方法:
1.加上column = false属性
或者xml加入column = false属性
2.在xml中加入
<class name="com.bjsxt.hibernate.Student" dynamic-update="true">
这样在数据库提交的时候就会只更新自己想改的字段
但是要注意 这个对象一旦在处瑜detach状态 再提交commit的时候无法作比较 所以就无法更新 所以更新的还是全部字段
@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);//merge可以合并对象 这样也不用发多余的其他字段的修改
session2.getTransaction().commit();
}
第三种 是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 orupdate
@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(); }
没有的话就save 有的话就update
clear
无论是load还是get 都会首先查找缓存(一级缓存),如果没有 ,才会去数据库查找,调用clear方法可以强制清除session缓存
@Test
public void testClear() { Session session = sessionFactory.getCurrentSession();
session.beginTransaction();
Teacher t = (Teacher)session.load(Teacher.class, );
System.out.println(t.getName()); session.clear();//如果不加这句话 将只发出一条select sql语句 ,加了之后清除session缓存下面就需要重新发了 Teacher t2 = (Teacher)session.load(Teacher.class, );
System.out.println(t2.getName());
session.getTransaction().commit(); }
flush方法
强制让缓存内容与数据库内容同步
具体在什么时间flush 是由flushmode设置
@Test
public void testFlush() { Session session = sessionFactory.getCurrentSession();
session.beginTransaction();
Teacher t = (Teacher)session.load(Teacher.class, );
t.setName("tttt"); session.flush(); //强制与数据库同步,发出update t.setName("ttttt"); session.getTransaction().commit(); //发现不一致 再发出update }
testschemaexport
可以在配置文件中不让他自动建表
然后自己写一个类建表
第一个参数这是指是否显示ddl语句 第二个参数是指是否执行ddl语句
@Test
public void testSchemaExport() {
new SchemaExport(new AnnotationConfiguration().configure()).create(false, true);
}
Hibernate 再接触 核心开发接口的更多相关文章
- Hibernate系列之核心开发接口
一.概述 所有的hibernate应用中都会访问5个核心接口,它们分别是: Configuration:配置hibernate,创建SessionFactory对象 SessionFactory:初始 ...
- HIbernate学习笔记(二) hibernate对象的三种状态与核心开发接口
1.在hibernate中持久化对象有三个状态,这个面试时可能会问到: (1)transient瞬时态:在数据库中没有与之匹配的数据,一般就是只new出了这个对象,并且在session缓存中也没有即此 ...
- hibernate(五)核心开发接口与对象的三种状态
本文链接:http://www.orlion.ml/37/ 一.Configuration 1.AnnotationConfiguration 2.进行配置信息的管理 3.configure()方法通 ...
- Hibernate学习笔记2.5(Hibernate核心开发接口和三种状态)
1.configuration(配置信息管理,产生sessionfactory) sessionfactory管理一系列的连接池 opensession 永远打开新的,需要手动close getcur ...
- Hibernate核心开发接口_SessionFactory详解
SessionFactory: a) 用来产生和管理Session b)通常情况下每个应用只需要一个SessionFactory c)除非要访问多个数据库的情况 d) 关注两个方法即: openS ...
- 5.Hibernate 核心开发接口
一.Configuration(AnnotationConfiguration) 作用:进行配置信息的管理 目标:用来产生SessionFactory 可以在configure 方法中指定hibern ...
- hibernate核心开发接口_Configuration
AnnotationConfiguration继承自Configuration,这里以AnnotationConfiguration为例: new AnnotationConfiguration(). ...
- Hibernate 再接触 ID生成策略
Xml 方法 在student.hbm.xml中 <generator class="uuid"></generator> 取值如下 1.identity: ...
- Hibernate 再接触 悲观锁和乐观锁
为什么取1248 二进制 CRUD 移位效率高 在并发和效率选择一个平衡点 一般不会考虑幻读 因为我们不会再一个事务里查询两次,(只能设置为seralizable) 悲观锁和乐观锁的前提是read-u ...
随机推荐
- SPSS中文版安装
我这里安装的是64位的 双击安装包 选择您的安装目录 在这里等几分钟 重要!安装完毕后将图中选项勾去掉! 这个时候输入一下授权码 9DNCAF2O3QVDV7FBIO696OO6GWLNXZPPRYT ...
- EventBus的使用;消息传递之EventBus;
EventBus传递消息(数据)和广播有点像,对广播传递数据有兴趣的可以看一下:Android数据传递,使用广播BroadcastReceiver: 1.添加build.gradle implemen ...
- Solr高效利用:Solr实现SQL的查询与统计
1.如何高效使用Solr查询功能 ?2.单个字段分组统计如何实现? 3.IN条件查询有几种方式? 4.多个字段分组统计是否只支持count? Cloudera公司已经推出了基于Hadoop平台的查询统 ...
- Microsoft Visual Studio正在等待操作完成
在编译项目的时候,有时会遇到 Microsoft Visual Studio正忙,结果就是半天没反应,要等待很长时间才能编译完成,在网上查了一下资料,微软官方是这样解释的: 阻止某些 devenv.e ...
- ES6入门箭头函数
箭头函数: 箭头函数可以与变量结构相结合(箭头函数返回对象的时候必须要在对象外边加()) 注意: 1️⃣函数体内的this是定义时所在的对象,而不是使用时的对象 2️⃣不可以当成构造函数,不可用new ...
- 推荐算法 pd
from django.db import connection select_sql = 'select * from model' datas = pd.read_sql(select_sql, ...
- oracle的schema的含义
转自:http://www.cnblogs.com/sfmjp/articles/2932748.html 在现在做的Kraft Catalyst 项目中,Cransoft其中有一个功能就是schem ...
- iPhone may be running a version of iOS that is not supported by this version of Xcode
Xcode6.0.1对ios8.1真机不识别,升级Xcode6.0.1为Xcode6.1,就行了.也可以,降低手机版本为以前的版本,想要降低手机版本请看我的另一片博客<iphone手机版本降级& ...
- impala 和 kudu 小记
1. impala(官网) 实时交互SQL大数据查询工具 它提供SQL语义,能查询存储在Hadoop的HDFS和HBase中的PB级大数据. Impala的最大特点也是最大卖点就是它的快速. Impa ...
- 【3-24】css样式表分类、选择器、样式属性
一.css样式表分类: (一)内联样式表:代码写在标签内的样式表 控制精确 代码重用性差 优先级最高 格式:<p style="样式属性">内容</p> ...