Hibernate ORM框架——续第一章:对象在Hibernate中的状态-程序员宅基地

技术标签: java  数据库  

对象在Hibernate中的状态
1.对象的状态也称之为对象的生命周期。


2.hibernate只分了3个阶段
  2.1 临时,瞬时()(transient)

  

  2.2 持久化(persistent)

 


  2.3 游离,托管,分离(),离线(detached)

 

3.图解:

 

 

4、代码

(1)hibernate.cfg.xml除映射文件路径变,其余不变

(2)util包不变

(3)类

package com.nf;

public class Person {
    private int pid ;
    private String name;
    private float salary;
    public int getPid() {
        return pid;
    }
    public void setPid(int pid) {
        this.pid = pid;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public float getSalary() {
        return salary;
    }
    public void setSalary(float salary) {
        this.salary = salary;
    }
    
    
}

(4)PersonMapper.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
    <class name="com.nf.Person" table="persons">
        <id name="pid" column="id">
            <generator class="native"></generator>
        </id>
        <property name="name" column="name"></property>
        <property name="salary" column="salary"></property>
    </class>
</hibernate-mapping>

4.test包测试--Main.java笔记说明(重点)

package com.nf;


import java.util.List;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.boot.MetadataSources;
import org.hibernate.boot.registry.StandardServiceRegistry;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;


import util.HibernateUtil;

public class Main {

    public static void main(String[] args) {
        // 如果只执行此代码,并且在hibernate.cfg.xml中设定了
        // <property name="hbm2ddl.auto">create</property>
        // 则会默认从映射文件中找到需求把相应的表创建好,放在PL/SQl中
        // SessionFactory sf= HibernateUtil.getSessionFactory();
        
        
        //一、演示的是瞬时-----save()/saveOrUpdate()------到持久的转换
        //transientToPersistent();
        
        //二、缓存:get方法01
        //cacheDemo();
        
        //二、缓存:get方法02--get前查询所有
        //cacheDemo2();
        
        //三、检验持久态下对对象的修改,要不要调用update-->不用
        //cacheDemo3();
        
        /*    四、
         * 下面表明整个持久化状态下,对它的更改,删除操作
         * 会当成一个整体看待,以最终的情况为准、
         */
        //cacheDemo4();        
        
        
        //五、游离对象
        /*    Person p = new Person();
            p.setPid(3);
            p.setName("yyyy");
            p.setSalary(5555);
            testUpdate2(p);*/
        
        
        //六、Load()方法
        testLoad();
        
    }

    //演示的是瞬时-----save()/saveOrUpdate()------到持久的转换
    private static void transientToPersistent() {
        SessionFactory sf = HibernateUtil.getSessionFactory();
        
        Session s = sf.openSession();
        Transaction tx = s.beginTransaction();
        
        Person p = new Person();
        p.setName("two");
        p.setSalary(2000); 
        //在调用save前都是属于瞬时状态。如果new的主键有与数据库相对应的,则为游离状态。
        //调用save的时候,即便没有事务提交,
        //也会从数据库查询主键值(主键生成策略是通过数据库产生:id = native)
        //select hibernate_sequence.nextval from dual
        s.save(p); // 添加数据
        
        System.out.println("-----添加数据,变成永久化状态-------");
        tx.commit();
        s.close();
        
        //sf.close();
        //不关闭的原因:
        //1.SessionFactory是一个大对象。每次创建都需要耗时。所以不再每一个方法内关闭
        //2.待关闭程序时,会自动关闭
        //3.使用监听器的方法来关闭
    }
    
    //二、缓存:get方法01
    //1:缓存的一个最重要的功能就是避免重复读取数据库
    //如果两个查询缓存相同,则只会返回一个语句
    
    //2:如果关闭Session后,再调用get()加载方法:会报以下错误:
    //Session/EntityManager is closed
    //说明:
    //所有的缓存都是放在session中,这个也称之为hibernate框架的一级缓存
    private static void cacheDemo(){
        SessionFactory sf = HibernateUtil.getSessionFactory();
        
        Session s = sf.openSession();
        
        Person p1 = s.get(Person.class, 1);
        //System.out.println(p1.getPid()+","+p1.getName()+","+p1.getSalary());
        
        //s.close();
        System.out.println("------------");
        Person p2 = s.get(Person.class, 1);
        
        s.close();
    }
    
    //二、缓存:get方法02--get前查询所有
    //1:缓存的一个最重要的功能就是避免重复读取数据库
    //如果两个查询缓存相同,则只会返回一个语句
    private static void cacheDemo2(){
        SessionFactory sf = HibernateUtil.getSessionFactory();
        
        Session s = sf.openSession();
        
        List<Person> list = s.createQuery("from Person").list();
        /*for (Person p : list) {
            System.out.println(p.getPid()+","+p.getName()+","+p.getSalary());
        }*/
        
        System.out.println("------查询数据结束------");
        
        
        Person p2 = s.get(Person.class, 1);
        //System.out.println(p2.getPid()+","+p2.getName()+","+p2.getSalary());
        
        s.close();
        //get()方法的避免重复的真正原理,如果list里面已经拿到数据并且放到会话当中了,那么当执行第二条
        //get()语句时,就直接拿会话中的数据,就不再重复调用查询数据库的语句。
    }

    
    //三、检验持久态下对对象的修改,要不要调用update-->不用
    /*如果一个对象以及是持久化状态了,那么此时对该对象进行
     * 各种修改,或者调用多次update、save方法时,
     * hibernate都不会发送sql语句,只有当事物提交的时候,
     * 此时hibernate才会拿当前这个对象与之前保存在session
     * 中的持久化对象进行比较,如果不相同就发送一条update的sql语句,
     * 否则就不会发送update语句
     * */
    private static void cacheDemo3(){
        SessionFactory sf = HibernateUtil.getSessionFactory();
        
        Session s = sf.openSession();
        Transaction tx = s.beginTransaction();
        
        Person p2 = s.get(Person.class, 1);
        System.out.println("------------");
        
        p2.setName("aa222");
        System.out.println("update 之前------------");
        //    s.update(p2);
        System.out.println("update 之后------------");
        
        tx.commit();
        s.close();
    }
    
    
    
    
    
    /*    四、
     * 下面表明整个持久化状态下,对它的更改,删除操作
     * 会当成一个整体看待,以最终的情况为准、
     * 但中途的操作语句还是有用的,会从上往下执行
     * 部分演示了工作单元的概念(Unit of work)
     */
    private static void cacheDemo4(){
        SessionFactory sf = HibernateUtil.getSessionFactory();
        
        Session s = sf.openSession();
        Transaction tx = s.beginTransaction();
        
        Person p2 = s.get(Person.class, 2);
        System.out.println("------------");
        
        p2.setName("aa333");
        System.out.println("update 之前------------");
        s.update(p2);
        System.out.println("update 之后------------");
        
        System.out.println("delete 之前------------");
        s.delete(p2);
        System.out.println("delete 之后------------");
        tx.commit();
        s.close();
    }
    
    /*
     * 像下面这样更新时,p参数的主键必须是数据库里面存在的
     * 也就是说p对象是一个游离对象
     * 游离对象:对象被new的同时,有主键和数据库相等的主键值
     */
    private static void testUpdate(Person p){
        SessionFactory sf = HibernateUtil.getSessionFactory();
        
        Session s = sf.openSession();
        Transaction tx = s.beginTransaction();
        
        s.update(p);
        tx.commit();
        s.close();
    }
    
    private static void testUpdate2(Person p){
        SessionFactory sf = HibernateUtil.getSessionFactory();
        
        Session s = sf.openSession();
        Transaction tx = s.beginTransaction();
    //    Person temp = s.get(Person.class, 3);
    //    s.update(p);
        s.merge(p);
        tx.commit();
        s.close();
    }
    
    
    /*load()方法:与get()方法不同的是,直接返回的是com.nf.Person_$$_jvst98f_0一个代理类。*/
    private static void testLoad(){
        SessionFactory sf = HibernateUtil.getSessionFactory();
        
        Session s = sf.openSession();
        Transaction tx = s.beginTransaction();
        Person temp = s.load(Person.class, 3);
        String name = temp.getName();
        
        System.out.println(temp.getClass().getName());
        tx.commit();
        s.close();
    }
}

 

 

/*以上个人整理笔记,如果有误或者有不懂的地方,欢迎评论与指出*/

转载于:https://www.cnblogs.com/Sunny-lby/p/7350553.html

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_34208283/article/details/93413782

智能推荐

40W+年薪算法岗,面试官都在问些什么?_算法岗年薪40-程序员宅基地

文章浏览阅读2.2k次。2015年自从我担任当时算法组的小组leader,我作为面试官面试了不少同学。前前后后面试了超过200名同学,其中有不少入职的同学后来发展都不错,也坚定了自己对于选人的标准的自信心。今年2020年找工作尤其艰难,我把这些年作为面试官一些重要的面试题整理出来,一共80道,希望能够帮助到大家,为了方便大家,我做了一个归类,一共分成了6大类,分别是:机器学习,特征工程,深度学习,NLP,CV,推荐系统。这些知识既是面试中的常见问题,也可以作为大家整理自己思路的参考资料。机器学习理论类:1. ._算法岗年薪40

STM32串行通信理解_stm32最大支持的串行通信个数-程序员宅基地

文章浏览阅读492次。文章目录一、通信接口的背景知识1.处理器与外部设备通信的两种方式2.串行通信按照数据传送方向分为:3.串行通信的通信方式:二、STM32串口通信基础1.STM32的串口通信接口2.UART异步通信方式引脚连接方法:3.UART异步通信方式特点:4.STM32串口通信过程:5.STM32异步通信要定义哪些参数:6.串口通信框图7.串口设置的一般步骤可以总结为如下几个步骤:一、通信接口的背景知识1.处理器与外部设备通信的两种方式(1)并行通信 -传输原理:数据各个位同时传输-优点:速度快-缺点:_stm32最大支持的串行通信个数

php简洁版JWT加密解密适用Laravel/ThinkPHP/Yii_laravel 解密 jwt-程序员宅基地

文章浏览阅读1.9k次。composer require firebase/php-jwtgit地址:https://github.com/firebase/php-jwt栗子:&lt;?phpuse \Firebase\JWT\JWT;$key = "example_key";$token = array( "iss" =&gt; "http://example.org", "aud"..._laravel 解密 jwt

RAID知识以及利用率-程序员宅基地

文章浏览阅读338次,点赞2次,收藏3次。作者:知乎用户链接:https://www.zhihu.com/question/20131784/answer/28026813来源:知乎著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。一共有0~6一共7种,这其中RAID 0、RAID1、RAID 5和RAID6比较常用。RAID 0:如果你有n块磁盘,原来只能同时写一块磁盘,写满了再下一块,做了RAID 0之..._raid4 得盘率

SQL Server如何启动_sqlserver启动程序在哪-程序员宅基地

文章浏览阅读1.2w次,点赞10次,收藏34次。1.单击开始程序,找到Microsoft SQL Server 2012,点击SQL Server配置管理器2.在弹出的窗口中点击sqlserver网络配置,点击协议在右侧点击tcp/ip,如果状态为禁用的话 先启用3.启用后右键点击tcp/ip协议,选择属性4.4.在弹出的窗口中,切换到ip地址窗口找到127.0.0.1本地IP地址,修改启用状态为是,然后点击确定5.然后返回到sqlserver服务,选择实例服务右键进行重新启动6.再次点击开始菜单,找到sql server mana_sqlserver启动程序在哪

Parsing ranges item in pcie-designware.c-程序员宅基地

文章浏览阅读1.3k次。parsing ranges item in pcie-designware.c

随便推点

Task :app:transformClassesAndResourcesWithR8ForRelease FAILED-程序员宅基地

文章浏览阅读5.5k次。这个是针对tinker报错问题,在运行gradlew assemblerelease的时候报一下错误:> Task :app:transformClassesAndResourcesWithR8ForRelease FAILEDR8 is the new Android code shrinker. If you experience any issues, ple..._transformclassesandresourceswithr8forrelease

Linux Install——SSH server_sudo apt install openssh-server-程序员宅基地

文章浏览阅读2.8k次,点赞3次,收藏5次。一、确认服务端是否安装ssh的服务器端ssh -V #这一步不准确netstat -tlp #用这个直接看有没有这样的进程[::]:ssh 如果安装可以看到下图所示:二、安装ssh服务端#执行如下命令sudo apt install openssh-server三、启动ssh-server#执行如下命令:/etc/init.d/ssh restart四、确认ssh-server已经正常工作#执行如下命令netstat -tlp如果正常工作会看到如下图所示的信息:看_sudo apt install openssh-server

greenplum麒麟安装笔记_麒麟系统编译greenplum-程序员宅基地

文章浏览阅读2.2k次。本周尝试在中标麒麟操作系统下安装greenplum。中标麒麟操作系统采用强化的Linux内核,我们首先准备好三台已安装中标麒麟服务版系统的虚拟机。规划他们的IP地址分别为:Master:10.81.2.20Segment1:10.81.2.21Segment2:10.81.2.22通过查找greenplum的官方网站可知,greenplum支持的操作系统如下:Red Hat Enterprise Linux 64-bit 7.x (See the following Note.)Re_麒麟系统编译greenplum

【Python】Web自动化,Xpath快速定位元素_python webfriver xpath-程序员宅基地

文章浏览阅读329次。例:百度一下:输入百度,点击搜索,这个过程的自动化1.点击元素 右键检查/打开开发者工具;2.选择那行代码右键选择copy,选择copy Xpath;3.粘贴到自己所写的代码里;4.搜索按钮定位使用同样方法;5.结果如下;参考:https://blog.csdn.net/Hu_wen/article/details/94738559..._python webfriver xpath

VMware Workstation 15 与 Device/Credential Guard_vmware与device/credential分别采用什么虚拟化架构-程序员宅基地

文章浏览阅读133次。VMware Workstation 15 与 Device/Credential Guard不兼容解决办法参考1参考2参考3看完 参考1 能解决问题的不用看 往后看了 因为 我是两者结合起来弄得 也就是关了hv,设置了hv服务禁用,并且关闭了内核保护1. 打开本电脑-》管理-》服务和应用程序-》服务下找到如下图的HV 主机服务,双击选择禁用。2. 打开Windows Po..._vmware与device/credential分别采用什么虚拟化架构

快速Android开发系列网络篇之Android-Async-Http-程序员宅基地

文章浏览阅读280次。先来看一下最基本的用法AsyncHttpClient client = new AsyncHttpClient();client.get("http://www.google.com", new AsyncHttpResponseHandler() { @Override public void onSuccess(String response) {..._d:\desk\android\meowsic-master\meowsic-master\app\libs\android-async-http-1.