Hibernate学习笔记2.5(Hibernate核心开发接口和三种状态)

时间:2022-09-02 16:08:32

1.configuration(配置信息管理,产生sessionfactory)

Hibernate学习笔记2.5(Hibernate核心开发接口和三种状态)

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

首先搞懂三种状态

Hibernate学习笔记2.5(Hibernate核心开发接口和三种状态)

三种状态

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();
}

如果有一个字段特别长 全改就会变低

Hibernate学习笔记2.5(Hibernate核心开发接口和三种状态)

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(); }

Hibernate学习笔记2.5(Hibernate核心开发接口和三种状态)

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核心开发接口和三种状态)的更多相关文章

  1. Hibernate学习笔记二:Hibernate缓存策略详解

    一:为什么使用Hibernate缓存: Hibernate是一个持久层框架,经常访问物理数据库. 为了降低应用程序访问物理数据库的频次,从而提高应用程序的性能. 缓存内的数据是对物理数据源的复制,应用 ...

  2. Hibernate学习笔记五:反向工程快速开发

    转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6768513.html  一:反向工程 Myeclipse提供由 数据库表 生成 java pojo 和 hib ...

  3. Hibernate学习笔记--第一个Hibernate框架程序

    一般使用集成开发环境是,把所需的类库添加到项目属性的库路径中,开发工具在部署时会自动复制所需要的类包到WEB-INF\lib目录下 MyEclipse中: 创建项目,右击项目->myeclips ...

  4. C语言学习笔记 &lpar;006&rpar; - 二维数组传参的三种表现形式

    # include <stdio.h> # include <stdlib.h> # define M # define N int getdate(int (*sp)[M]) ...

  5. Swift 学习笔记 &lpar;解决Swift闭包中循环引用的三种方法&rpar;

    话不多说 直接上代码 class SmartAirConditioner { var temperature:Int = //类引用了函数 var temperatureChange:((Int)-& ...

  6. Hibernate学习笔记(二)—— 实体规则&amp&semi;对象的状态&amp&semi;一级缓存

    一.持久化类 1.1 什么是持久化类? Hibernate是持久层的ORM映射框架,专注于数据的持久化工作.所谓的持久化,就是将内存中的数据永久存储到关系型数据库中.那么知道了什么是持久化,什么又是持 ...

  7. HIbernate学习笔记(二) hibernate对象的三种状态与核心开发接口

    1.在hibernate中持久化对象有三个状态,这个面试时可能会问到: (1)transient瞬时态:在数据库中没有与之匹配的数据,一般就是只new出了这个对象,并且在session缓存中也没有即此 ...

  8. Spring MVC 学习笔记12 —— SpringMVC&plus;Hibernate开发(1)依赖包搭建

    Spring MVC 学习笔记12 -- SpringMVC+Hibernate开发(1)依赖包搭建 用Hibernate帮助建立SpringMVC与数据库之间的联系,通过配置DAO层,Service ...

  9. Hibernate学习笔记(二)

    2016/4/22 23:19:44 Hibernate学习笔记(二) 1.1 Hibernate的持久化类状态 1.1.1 Hibernate的持久化类状态 持久化:就是一个实体类与数据库表建立了映 ...

随机推荐

  1. Unity中游戏的声音管理

    using UnityEngine;using System.Collections;using System.Collections.Generic;/// <summary>/// 用 ...

  2. 【转】Android APK的数字签名的作用和意义

    1. 什么是数字签名? 数字签名就是为你的程序打上一种标记,来作为你自己的标识,当别人看到签名的时候会知道它是与你相关的     2. 为什么要数字签名? 最简单直接的回答: 系统要求的.  Andr ...

  3. &lbrack;Firebase&rsqb; Deploy you website to Firebase

    If you are looking for a host website, you can try Firebase, heroku or AWS... Today, I tried to depl ...

  4. 基于TCP协议的网络编程

    TCP通信协议是一种可靠的传输层协议,它在通信的两端各建立一个Socket,从而在通信的两端之间形成虚拟网络链路.一旦建立了虚拟的网络链路,两端的程序就可以通过虚拟链路进行通信.Java使用Socke ...

  5. 不依赖浏览器控制台的JavaScript断点调试方法

    随着浏览器的逐渐强大,绝大多数情况下的代码调试都是可以通过浏览器自带的一些调试工具进行解决.然而对于一些特殊情况仍然无法享受到浏览器的强大 调试能力,比如QQ客户端内嵌web的调试(虽然说QQ目前已经 ...

  6. logback KafkaAppender 写入Kafka队列&comma;集中日志输出&period;

    为了减少应用服务器对磁盘的读写,以及可以集中日志在一台机器上,方便使用ELK收集日志信息,所以考虑做一个jar包,让应用集中输出日志 网上搜了一圈,只发现有人写了个程序在github 地址:https ...

  7. JS实现数组去重方法总结&lpar;六种方法&rpar;

    方法一: 双层循环,外层循环元素,内层循环时比较值 如果有相同的值则跳过,不相同则push进数组 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 Array. ...

  8. linux&sol;unix解压缩

    转自:http://blog.sina.com.cn/s/blog_6f2d29af01015ac6.html zip: 压缩: zip [-AcdDfFghjJKlLmoqrSTuvVwXyz$][ ...

  9. 主机服务绑定IP

    在用 netstat -na  查看当前主机提供的服务,例如显示如下结果: tcp        0      0 127.0.0.1:9000              0.0.0.0:*      ...

  10. JNI编程实现(Linux)

    JNI是Java Native Interface的缩写,是Java平台的本地调用,从Java1.1就成为了Java标准的一部分,它允许Java代码和其它语言的代码进行互相调用,只要调用约定支持即可, ...