hibernate第二天

1.修改
update()
merge(): save() update() 有没有OID
saveOrUpdate() 修改
saveOrUpdate()和merge()区别
解析:区别 1:saveOrUpdate() 会改变入参进来对象的状态 merge不会
区别 2: saveOrUpdate() 没有返回值 merge返回一个对象
2.OID
OID 是持久化类(Student)与数据表主键对应属性, 用来唯一区分持久化对象。
3.删除
4.PO VO DTO POJO JavaBean
JavaBean=POJO 和数据库无关的 PageUtil类,需要持久化不不需要
PO=POJO+xml
5.主键生成策略
Increment :hibernate生成,弊端:多线程可能取到的是同一个id,但是导致其他线程保存失败
identity: 数据库生成 ,mysql支持,oracle不支持
sequence: 数据库生成,oracle支持
native: 数据库决定:mysql使用identity,oralce使用序列
uuid Hibernate生成 优点:不会重复,数据迁移比较好 要求:列的类型字符串
assigned :程序员手动操作的。

OID
Hibernate中Java对象的三种状态
get和load

在 increment基础之上操作!
hibernate中的三种状态
瞬时状态:在数据库中没有关联的数据,没有加入Session中。
持久状态:被session管理,拥有数据库标识。
游离状态:脱离了与其关联的session的管理。

01.瞬时状态 Student stu=new Student();
新创建的对象,没有与session产生关联!
02.持久状态 session.save(stu)
被session管理,存在session缓存中!当commit的时候,会提交到数据库!
03.游离状态 session.close(); stu
曾经被session管理过,但是现在不存在session缓存中了!

瞬时状态 和游离状态的区别在于:是否被session管理过! 对象是否拥有OID(对象标识符)!

对象有主键值id,那么就有OID,在操作的时候会执行update语句!
没有主键值id,那么就没有OID,在操作的时候会执行insert语句!

对象只要是没有OID,在执行update()肯定报错!在执行saveOrupdate的时候会执行Save()方法!

三种状态的转换:
(1).瞬时状态转换为持久状态
使用Session的Save( ),SaveOrUpdate( )等方法保存对象后,该对象的状态有瞬时 状态转为持久状态。
使用Session的get( )或load( )方法获取对象,该对象的状态是持久状态
(2).持久状态转为瞬时状态
执行Session的delete( )方法后,对象由原来的持久状态变为瞬时状态,因此时对象没有与任何的数据库数据关联。
(3).持久状态转为游离状态
执行Session( )的evict( ),clear( )或close( )方法,对象由原来的持久状态转为游离状态。
(4).游离状态转为持久转态
执行Session的Update()或saveOrUpdate( )方法,对象由游离状态转为持久状态,该对象再次与当前Session相关联。
(5).游离状态转为瞬时状态
执行的Session的delete( )方法,对象由游离状态转为瞬时状态。

6.核心API
6.1 Configuration
InputStream x = ConfigHelper.getResourceAsStream("/hibernate.properties");
hibernate.hbm.xml配置文件
6.2 SessionFactory:重量级的,一个程序中一份就可以了。线程安全的。
Creates Sessions. Usually an application has a single SessionFactory.
Threads servicing client requests obtain Sessions from the factory.
创建会话。通常, 应用程序有一个单一的 SessionFactory。
服务客户端请求的线程从工厂获取会话。
SessionFactorys are immutable. The behaviour of a SessionFactory
is controlled by properties supplied at configuration time.
These properties are defined on Environment.
SessionFactorys 是不可变的。SessionFactory 的行为由配置时提供的属性控制。
这些属性是在环境中定义的。
线程安全的::方法中来用一个对象,不用考虑线程安全问题
成员变量,发现他是一个接口,接口中都是方法

6.3 Session 他也是一个接口,实现类是SessionImpl ,当中也是方法,但是他是线程非安全的。
Session构建两种方式
方式一:factory.openSession(); 随机从连接池中获取到一个连接。每次取得的session一定是新的。
factory.getCurrentSession(); 一定获取的是和当前线程绑定的session.调度多次,内存地址一样,同一个对象

6.4 事务

7.刷新缓存(某一时刻点触发的动作)
tx.commit() ;刷新缓存 刷新缓存做什么 (做脏检查)
快照(Snapshot)是某个数据集在某一特定时刻的镜像,也称为即时拷贝,它是这个数据集的一个完整可用的副本

Configuration cfg;
Session session;
Transaction tx;
SessionFactory factory;
@Before
public void myBefore(){
//创建配置对象
cfg=new Configuration().configure();
// 2.根据配置对象创建SessionFactory
factory=cfg.buildSessionFactory();
//3.根据SessionFactory去创建Session
session= factory.openSession();

//3.5在Session创建后开启事务 xxx0001 xxxxx003
tx= session.beginTransaction();
}
@Test
public void loadTest(){
Dog dog = session.get(Dog.class, 6);
System.out.println(dog.getDogname());
}
@Test
//01.修改
public void testUpdate(){
//修改一个编号为2的狗狗信息
Transaction tx = session.beginTransaction();
Dog dog=new Dog();//瞬时态
dog.setDogname("嘿嘿");
dog.setDogage(12);
session.merge(dog);//持久态
/* Dog dog=session.load(Dog.class,2);
dog.setDogname("大黄3");
dog.setDogage(33);
session.update(dog);*/
tx.commit();
System.out.println("update ok!");
}
//02.删除
@Test
public void testDelete(){
//修改一个编号为2的狗狗信息
Transaction tx = session.beginTransaction();
Dog dog=new Dog();//瞬时态
System.out.println(session+"===========================");
/* session.delete(dog);
tx.commit();*/
System.out.println("del ok!");
}
@Test
public void testCahce(){
Dog dog2 = session.get(Dog.class, 6);
System.out.println(dog2.getDogname());

Dog dd=new Dog();
dd.setDogage(11);
dd.setDogname("小花是狗");
dd.setDogid(11);
session.update(dd);
tx.commit();
Dog dog = session.get(Dog.class, 6);
System.out.println(dog.getDogname());
System.out.println(dd.getDogname());
//
}

时间: 2024-08-05 21:47:24

hibernate第二天的相关文章

面试题:hibernate 第二天

## Hibernate第二天 ## ### 回顾与反馈 ### Hibernate第一天 1)一种思想 : ORM OM(数据库表与实体类之间的映射) RM 2)一个项目 : CRM 客户关系管理系统 客户公司表 3)一个框架 : Hibernate 简化JDBC 面向对象的数据库操作 注意问题 : Hibernate简化了操作 但是牺牲了SQL的执行性能 线程问题 数据库连接放到线程 程序世界 程序运行期间 进程(一个软件运行期间驻留在内存中的一个程序) 与 进程接收到执行任务的时候 它就会

Hibernate第二章关联映射的总结

1.type值的解释:如下图: 1)type的值,不是java语言的一个类型的全称,而是一个hibernate自定义 的类型的名称. 2)Type的值,其实是对应hibernate中的一个类型的简称,而由 org.hibernate.type包下面的类型来真正完成java类型与数据库类型的传 换. 2.单类对单表的映射配置 1)类型的处理: I.各种:type II.精度:precision,scale III.逻辑值的处理:boolean,yes_no 2)主键的处理 Native,assig

hibernate 第二天

Hibernate主键生成规则 Hibernate缓存 持久态会自动修改数据库 Hibernate事物的操作 Session Hibernate 的api使用  查询 Criteria对象 Sqlquery对象 但是这种方法不方便  可以使用下面的解决方法  返回的就是list对象的数据 开始第三天复习hibernate

Hibernate框架--对象的状态,缓存, 映射

回顾Hibernate第二天: 1.  一对多与多对一 2. 多对多 3. inverse/cascade 4. 关联关系的维护 一对多: <set name="映射的集合属性" table="(可选)集合属性对应的外键表"> <key column="外键表的,外键字段" /> <one-to-many class="集合元素的类型" /> </set> 多对一: <ma

hibernate查漏补缺2

Hibernate对象状态 瞬时(transient):由new操作符创建,且尚未Hibernate Session关联.瞬时对象不会被持久化到数据库,也不会被赋予持久化标识. 持久(persistent):持久化的实例在数据库中有对应的记录,并拥有一个持久化标识. 持久化的实例可能是刚被保存,或刚被加载的,无论哪一种,它都只存在于相关联的Session作用范围内.这点很重要.Hibernate会检测处于持久化状态的对象的任何变动,在当前操作单元执行完毕时,将对对象数据与数据库同步. 脱管(de

Java开发者必读的5本最佳Hibernate书籍

Java开发者必读的5本最佳Hibernate书籍 分享到:17 本文由 ImportNew - will 翻译自 javarevisited.欢迎加入Java小组.转载请参见文章末尾的要求. Hibernate是最受欢迎的开源ORM(Object Relational Mapping 对象关系映射)框架之一,并且随着JPA的出现,它已成为开发Java企业级应用持久层的一个标准.我经常会收到这样一些反馈,如”哪本是学习hibernate最好的书籍”或”请推荐一些学习Spring和Hibernat

spring 之 spring整合hibernate

spring整合hibernate步骤如下: 新建java项目 导入jar包 编写vo类 @Entity @Table(name="t_user") public class User implements Serializable{ @Id @GeneratedValue(strategy=GenerationType.AUTO) private int id; private String name; private int age; public int getId() { re

Hibernate框架第三天

**课程回顾:Hibernate第二天** 1. 持久化类和一级缓存 * 持久化类:JavaBean + 映射的配置文件 * 持久化对象的三种状态 * 瞬时态 * 持久态:有自动更新数据的能力 * 托管态 * Session的一级缓存,快照机制 * 主键的生成策略 2. 管理事务 * 设置隔离级别 * 丢失更新的问题,乐观锁:添加属性version,配置<version name="version"> * 绑定本地的Session,事务需要service层开启,dao层需要

2015从头开始配置Hibernate-------Hibernate异常集锦

Eclipse不像是MyEclipse,它的Hibernate的使用需要进行从头配置.配置的基本方法就是把相应的jar包复制到WEB-INF/lib目录下.这些jar包,我是从 "http://ncu.dl.sourceforge.net/project/hibernate/hibernate3/3.6.10.Final/hibernate-distribution-3.6.10.Final-dist.zip" 这个地址下载的. 在"hibernate-distributio