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

原文地址:https://www.cnblogs.com/wangbenqing/p/7583286.html