Hibernate---对象的三种状态

      Hibernate---对象的三种状态

  简而言之,hibernate本就是面向对象的基于ORM的框架,位于dao层,对数据进行操作的框架。我就谈谈hibernate的对象的三种状态。他们分别为:游离,持久和瞬时。通过代码来详解一下吧。

  hibernate.cgf.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC"-//Hibernate/Hibernate Configuration DTD 3.0//EN""http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"><hibernate-configuration><session-factory><!-- property 元素用于配置Hibernate中的属性键:值--><!-- hibernate.connection.driver_class : 连接数据库的驱动  --><property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property><!-- hibernate.connection.username : 连接数据库的用户名 --><property name="hibernate.connection.username">root</property><!-- hibernate.connection.password : 连接数据库的密码 --><property name="hibernate.connection.password">root</property><!-- hibernate.connection.url : 连接数据库的地址,路径 --><property name="hibernate.connection.url">jdbc:mysql://localhost:3306/Hibernate</property><!-- show_sql: 操作数据库时,会 向控制台打印sql语句 --><property name="show_sql">true</property><!-- format_sql: 打印sql语句前,会将sql语句先格式化  --><property name="format_sql">true</property><!-- hbm2ddl.auto: 生成表结构的策略配置update(最常用的取值): 如果当前数据库中不存在表结构,那么自动创建表结构.如果存在表结构,并且表结构与实体一致,那么不做修改如果存在表结构,并且表结构与实体不一致,那么会修改表结构.会保留原有列.create(很少):无论是否存在表结构.每次启动Hibernate都会重新创建表结构.(数据会丢失)create-drop(极少): 无论是否存在表结构.每次启动Hibernate都会重新创建表结构.每次Hibernate运行结束时,删除表结构.validate(很少):不会自动创建表结构.也不会自动维护表结构.Hibernate只校验表结构. 如果表结构不一致将会抛出异常.--><property name="hbm2ddl.auto">update</property><!-- 数据库方言配置org.hibernate.dialect.MySQLDialect (选择最短的)--><property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property><!-- hibernate.connection.autocommit: 事务自动提交<property name="hibernate.connection.autocommit">true</property>--><!-- 将Session与线程绑定=> 只有配置了该配置,才能使用getCurrentSession --><property name="hibernate.current_session_context_class">thread</property><!-- 引入ORM 映射文件填写src之后的路径--><mapping resource="resource/User.hbm.xml"/></session-factory>
</hibernate-configuration>

  user.hbm.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">
<!-- ORM元数据  表对象关系映射文件package : 配置该配置文件中类所在的包.  -->
<hibernate-mapping package="com.huhu.domain"><!-- class: 配置实体与表的关系name : 填写实体的完整类名table: 与实体对应表的名称dynamic-insert:动态插入 默认值是falsetrue=>如果字段值为null,不参与insert语句dynamic-update:动态更新  默认值"false"true=> 没改动过的属性,将不会生成到update语句中--><class name="com.huhu.domain.User" table="t_user"><!-- id: 配置实体与表中 id对应name: user对象中标识主键的属性名称column: 主键在表中的列名length: 列的数据长度unsaved-value(不常用): 指定主键为什么值时,当做null来处理.access(强烈推荐不要用):field 那么在操作属性时,会直接操作对应的字段而不是get/set方法--><id name="id" column="id"><!-- generator:主键生成策略1.increment  数据库自己生成主键. 先从数据库中查询最大的ID值,将ID值加1作为新的主键2.identity  依赖于数据的主键自增功能3.sequence	序列,依赖于数据中的序列功能(Oracle).4.hilo(纯了解,永远用不到) : Hibernate自己实现序列的算法,自己生成主键. (hilo算法 )5.native 自动根据数据库判断,三选一. identity|sequence|hilo6.uuid  生成32位的不重复随机字符串当做主键7.assigned 自己指定主键值. 表的主键是自然主键时使用.--><generator class="native"></generator></id><!-- property : 实体中属性与表中列的对应name : 实体中属性名称column : 表中列的名称length : 数据长度precision: 小数点后的精度scale:	有效位数insert(一般不用): 该属性是否加入insert语句.update(一般不用): 该属性是否加入update语句.not-null : 指定属性的约束是否使用 非空unique : 指定属性的约束是否使用 唯一--><!--type: 表达该属性的类型可以用三种方式指定属性java类型		 		 数据库类型指定			Hibernate类型指定java.lang.String	varchar				string--><property name="name" column="name"></property><property name="password" column="password"></property></class>
</hibernate-mapping>

  User

package com.huhu.domain;// Hibernate
public class User {private Integer id;private String name;private String password;public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}@Overridepublic String toString() {return "User [id=" + id + ", name=" + name + ", password=" + password+ "]";}}

  HibernateUtils

package com.huhu.utils;import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.hibernate.classic.Session;//完成Hibernate工具类
//封装配置文件读取操作
//封装Sessionfactroy创建操作
//封装session获得操作
public class HibernateUtils {private static SessionFactory sf;static{//1加载配置Configuration  conf = new Configuration().configure();//2 根据Configuration 配置信息创建 SessionFactorysf = conf.buildSessionFactory();//Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() {@Overridepublic void run() {System.out.println("虚拟机关闭!释放资源");sf.close();}}));}public static org.hibernate.Session  openSession(){//3 获得sessionSession session = sf.openSession();return session;}public static org.hibernate.Session  getCurrentSession(){//3 获得sessionSession session = sf.getCurrentSession();return session;
}public static void main(String[] args) {System.out.println(openSession());}
}

  HibernateDemo1

package com.huhu.a_state;import com.huhu.domain.User;
import com.huhu.utils.HibernateUtils;
import org.hibernate.Session;/*** 对象的三种状态*/
public class HibernateDemo1 {//三种状态public void fun1() {Session session = HibernateUtils.openSession();session.beginTransaction();//--------------------------------------User u = new User();          //status : 瞬时状态u.setName("tom");           //status : 瞬时状态u.setPassword("1234");      //status : 瞬时状态//保存session.save(u);            //status : 持久状态//调用save方法时,数据库有没有对应记录//没有记录,但最终会被同步到数据库中,仍时持久状态//--------------------------------------session.getTransaction().commit();      //status : 持久状态session.close();            //status : 游离状态}// 三种状态的转换  瞬时=》持久public void fun2() {Session session = HibernateUtils.openSession();session.beginTransaction();//--------------------------------------User u = new User();           //status : 瞬时状态u.setName("he");             //status : 瞬时状态u.setPassword("123456");     //status : 瞬时状态session.save(u);             //status : 持久状态//--------------------------------------session.getTransaction().commit();      //status : 持久状态//事务提交时会把持久对象保存到数据库//increment=>hibernate 自动查询最大id,然后生成主键//assigned =>自动生成主键session.close();}// 瞬时=》游离 瞬时:没有关联没有id 游离:没有关联有id(与数据库对应的id)public void fun3() {Session session = HibernateUtils.openSession();session.beginTransaction();//--------------------------------------//status : 持久状态User u = new User();u.setId(2);         //此时为游离状态//--------------------------------------session.getTransaction().commit();      //status : 持久状态//事务提交时会把持久对象保存到数据库session.close();}//持久=》瞬时1 持久:有关联,有id,瞬时:无关联无idpublic void fun4() {Session session = HibernateUtils.openSession();session.beginTransaction();//--------------------------------------//status : 持久状态//通过get方法,得到持久状态对象User u = (User) session.get(User.class, 2); //持久状态//--------------------------------------session.getTransaction().commit();//事务提交时会把持久对象保存到数据库session.close();  //游离状态u.setId(null);}//持久=》瞬时1  持久:有关联,有id,瞬时:无关联无idpublic void fun5() {Session session = HibernateUtils.openSession();session.beginTransaction();//--------------------------------------//status : 持久状态//通过get方法,得到持久状态对象User u = (User) session.get(User.class, 4); //持久状态session.evict(u);       //将User对象和session的关联移除u.setId(null);          //瞬时对象//--------------------------------------session.getTransaction().commit();session.save(u);//事务提交时会把持久对象保存到数据库session.close();  //游离状态}//  持久=》游离   持久:有关联,有idpublic void fun6() {Session session = HibernateUtils.openSession();session.beginTransaction();//--------------------------------------//status : 持久状态//通过get方法,得到持久状态对象User u = (User) session.get(User.class, 4); //持久状态session.evict(u);       //将User对象和session的关联移除//--------------------------------------session.getTransaction().commit(); //游离session.close();  //游离状态}// 游离=》瞬时  瞬时:无关联无idpublic void fun7() {Session session = HibernateUtils.openSession();session.beginTransaction();//--------------------------------------//status : 持久状态//通过get方法,得到持久状态对象User u = (User) session.get(User.class, 4); //持久状态session.evict(u);       //瞬时u.setId(null);          //瞬时//--------------------------------------session.getTransaction().commit(); //瞬时session.close();  //瞬时状态}//    游离=》持久  是否与session关联public void fun8() {Session session = HibernateUtils.openSession();session.beginTransaction();//--------------------------------------//status : 持久状态//通过get方法,得到持久状态对象User u = (User) session.get(User.class, 4); //持久状态session.evict(u);       //游离session.update(u);      //持久//--------------------------------------session.getTransaction().commit(); //持久  打印updata语句session.close();  //瞬时状态}public void fun9() {Session session = HibernateUtils.openSession();session.beginTransaction();//--------------------------------------////通过get方法,得到持久状态对象User u = (User) session.get(User.class, 4);u.setName("nenen");//--------------------------------------session.getTransaction().commit();session.close();  //瞬时状态}public static void main(String[] args) {HibernateDemo1 d = new HibernateDemo1();//d.fun1();d.fun9();}
}

 

    代码显而易见。如果觉得不明显再来一个图吧。

  

 

  总结下吧:

 三种状态有什么用:

    1.持久状态:我们使用hibernate主要时为了持久化数据

    2.对于对象的状态: 我们期望我们现需要同步到数据库的数据,都被转化为持久化 

 持久话对象的特点:
    hibernate会自动将持久话对象的变化同步到数据库.

  所以说hibernate是一个面向对象的框架,利用对象的操作数据。
  

 

转载于:https://www.cnblogs.com/meiLinYa/p/9143184.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/353546.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

IDEA项目搭建四——使用Mybatis实现Dao层

一、引入mybatis及mysql的jar包 可以从阿里云上面查找版本&#xff0c;db操作放在dao层所以打开该层的pom.xml文件&#xff0c;找到<dependencies>节点增加两个引入 <dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifac…

JUnit 5 –动态测试

在定义测试时&#xff0c;JUnit 4有一个很大的弱点&#xff1a;它必须在编译时发生。 现在&#xff0c;JUnit 5将解决此问题&#xff01; Milestone 1 刚刚发布 &#xff0c;并带有全新的动态测试&#xff0c;该动态测试允许在运行时创建测试。 总览 本系列中有关JUnit 5的其他…

python基础-网络基础知识和网络编程

之前对这一块的知识,总是记不住,这次正好有系统的学习,所以决定好好的梳理一下 1. 计算机网络基础知识 1.1 互联网协议和OSI模型 *协议模型互联网协议按照功能不同分为osi七层或tcp/ip五层或tcp/ip四层,如下图所示 *每层运行常见物理设备 *每层运行常见的协议 1.2 基础网络概念…

LeetCode(90):子集 II

Medium&#xff01; 题目描述&#xff1a; 给定一个可能包含重复元素的整数数组 nums&#xff0c;返回该数组所有可能的子集&#xff08;幂集&#xff09;。 说明&#xff1a;解集不能包含重复的子集。 示例: 输入: [1,2,2] 输出: [[2],[1],[1,2,2],[2,2],[1,2],[] ] 解题思路&…

一念成佛,一念成魔

一念成佛&#xff0c;一念成魔 前几天&#xff0c;因我与寝友的一次错误导致电脑系统崩溃&#xff0c;连开机都开不了了。可我发现我并不是很生气&#xff0c;只是用玩笑话调侃了他一下。后来想想&#xff0c;要是放在以前&#xff0c;我一定会大发脾气&#xff0c;几天都不去理…

nodejs微信小程序+python+PHP计算机网络在线考试系统-计算机毕业设计推荐

目 录 摘 要 I ABSTRACT II 目 录 II 第1章 绪论 1 1.1背景及意义 1 1.2 国内外研究概况 1 1.3 研究的内容 1 第2章 相关技术 3 2.1 nodejs简介 4 2.2 express框架介绍 6 2.4 MySQL数据库 4 第3章 系统分析 5 3.1 需求分析 5 3.2 系统可行性分析 5 3.2.1技术可行性&#xff1a;…

组件模块化使用

// 使用$attr可以直接在父元素上拿数据让子元素使用或者是孙元素使用 <template><div>props:{{name}},{{age}} 或者 {{$props[name]}},{{$props[age]}} <br>attrs: {{$attrs[gender]}} 在$attrs里面只会有props没有注册的属性</div> </template>…

VS2010发布、打包安装程序超全超详细

找不到原文链接 1、 在vs2010 选择“新建项目”“其他项目类型”“ Visual StudioInstaller “安装项目”&#xff1a; 命名为&#xff1a;Setup1 。 这是在VS2010中将有三个文件夹&#xff0c; 1.“应用程序文件夹”表示要安装的应用程序需要添加的文件&#xff1b; 2.“…

介绍HawkFX

如前所述&#xff0c; 我开始玩JRubyFX 。 对我来说&#xff0c;学习一些新的最佳方法可以解决用例&#xff0c;因此我开始为Hawkular创建库存浏览器。 为什么选择JRubyFX&#xff1f; 让我们首先从“什么是JRubyFX”开始&#xff1f; JRubyFX是通过JRuby引入Ruby世界的JavaFX…

HibernateTemplate

org.springframework.orm.hibernate5.HibernateTemplate 这是spring-orm-4.3.4.RELEASE.jar包中的一个类&#xff0c;这个类是对Hibernate进行了封装&#xff1b; 这是可以进行注入的属性&#xff0c;需要注入sessionFactory属性&#xff0c;因此我们需要创建一个sessionFactor…

第四章: 4.1 logging模块 | 正则表达式

修改json数据然后写入json文件中 f open(1234.json,r,encodingutf-8) data f.read() data1 json.loads(data)data1[status] 1f1 open(1234.json,w,encodingutf-8)json.dump(data1,f1) hashlib md5值的用法 #加入下面这个就可以 password input(请输入密码:)m hashlib.md…

使用保险柜管理机密

您如何存储秘密&#xff1f; 密码&#xff0c;API密钥&#xff0c;安全令牌和机密数据属于秘密类别。 那是不应该存在的数据。 在容易猜测的位置&#xff0c;不得以纯文本格式提供。 实际上&#xff0c;不得在任何位置以明文形式存储它。 可以使用Spring Cloud Config Server或…

winScp中文乱码设置

打开一个putty窗口(图一)&#xff0c;左上角鼠标左键点击&#xff0c;弹出设置界面&#xff0c;选择Change Settings&#xff0c;在图二界面的window->translation&#xff0c;Remote character set选择UTF-8&#xff0c;Apply应用即可。 转载于:https://www.cnblogs.com/ya…

多台电脑共用一个耳机、音箱

台式机电脑声卡一般有三个插孔&#xff0c;一个是麦克风&#xff0c;一个是耳机&#xff0c;另一个就是LineIn输入口了&#xff0c;买一根AUX线&#xff0c;一头插入笔记本的耳机插口&#xff0c;另一头插入台式机linein口&#xff1b;在控制面板的声音中选择线路输入&#xff…

liferay开发文档_Liferay –简单主题开发

liferay开发文档实际上&#xff0c;Liferay的6.1版本已经走了很长一段路&#xff0c;该版本完全支持JSF和IceFaces。 我一直在努力学习它的绳索&#xff0c;因为我希望使其成为我们团队中的标准协作工具。 好的软件应用程序可以解决问题&#xff0c;但是好的软件应用程序不仅可…

ACRush 楼天城回忆录

利用假期空闲之时&#xff0c;将这几年 GCJ &#xff0c; ACM &#xff0c; TopCoder 参加的一些重要比赛作个回顾。首先是 GCJ2006 的回忆。 Google Code Jam 2006 一波三折&#xff1a; Google Code Jam 2006 是我第一次到美国参加现场的程序设计比赛。 Google Code Jam 2006…

JUnit 5 –条件

最近&#xff0c;我们了解了JUnit的新扩展模型以及它如何使我们能够将自定义行为注入测试引擎。 我向你保证要看情况。 现在就开始吧&#xff01; 条件允许我们在应该执行或不应该执行测试时定义灵活的标准。 它们的正式名称是“ 条件测试执行” 。 总览 本系列中有关JUnit 5…

我的编程竞赛之路 ——中国大学生计算机编程第一人楼天城访谈

记者/陈秋歌 25岁的楼天城有“中国大学生计算机编程第一人”的称号&#xff0c;也被参加竞赛的学子们敬称为“楼教主”。他的传奇经历一直激励着众多年轻学子&#xff1a;从2001年开始参加计算机编程竞赛&#xff0c;并连获全国一等奖&#xff1b;2004年入选国家集训队&#xf…

jenkins部署_Jenkins:部署JEE工件

jenkins部署随着持续集成和持续交付的出现 &#xff0c;我们的构建被分为不同的步骤&#xff0c;以创建部署管道。 这些步骤中的一些步骤可以是例如编译和运行快速测试&#xff0c;运行慢速测试&#xff0c;运行自动验收测试或发布应用程序等。 部署流程的最后步骤意味着将我们…

2013年3月编程语言排行榜:有毒的Java

2013年3月12日&#xff0c;Tiobe公布了新一期编程语言排行榜。Java依旧是占据第一的位置&#xff0c;C语言紧随其后。值得注意的Objective-C持续发力&#xff0c;已经占到了第三的位置。咋一看榜单&#xff0c;前5条中C#下滑最快&#xff0c;从第3名下降到第五名。而其他语言都…