分享web开发知识

注册/登录|最近发布|今日推荐

主页 IT知识网页技术软件开发前端开发代码编程运营维护技术分享教程案例
当前位置:首页 > 前端开发

hibernate第二天

发布时间:2023-09-06 01:13责任编辑:蔡小小关键词:暂无标签

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

hibernate第二天

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

知识推荐

我的编程学习网——分享web前端后端开发技术知识。 垃圾信息处理邮箱 tousu563@163.com 网站地图
icp备案号 闽ICP备2023006418号-8 不良信息举报平台 互联网安全管理备案 Copyright 2023 www.wodecom.cn All Rights Reserved