Hibernate---对象的三种状态
生活随笔
收集整理的這篇文章主要介紹了
Hibernate---对象的三种状态
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
Hibernate---對(duì)象的三種狀態(tài)
簡(jiǎn)而言之,hibernate本就是面向?qū)ο蟮幕贠RM的框架,位于dao層,對(duì)數(shù)據(jù)進(jìn)行操作的框架。我就談?wù)刪ibernate的對(duì)象的三種狀態(tài)。他們分別為:游離,持久和瞬時(shí)。通過(guò)代碼來(lái)詳解一下吧。
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 : 連接數(shù)據(jù)庫(kù)的驅(qū)動(dòng) --><property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property><!-- hibernate.connection.username : 連接數(shù)據(jù)庫(kù)的用戶名 --><property name="hibernate.connection.username">root</property><!-- hibernate.connection.password : 連接數(shù)據(jù)庫(kù)的密碼 --><property name="hibernate.connection.password">root</property><!-- hibernate.connection.url : 連接數(shù)據(jù)庫(kù)的地址,路徑 --><property name="hibernate.connection.url">jdbc:mysql://localhost:3306/Hibernate</property><!-- show_sql: 操作數(shù)據(jù)庫(kù)時(shí),會(huì) 向控制臺(tái)打印sql語(yǔ)句 --><property name="show_sql">true</property><!-- format_sql: 打印sql語(yǔ)句前,會(huì)將sql語(yǔ)句先格式化 --><property name="format_sql">true</property><!-- hbm2ddl.auto: 生成表結(jié)構(gòu)的策略配置update(最常用的取值): 如果當(dāng)前數(shù)據(jù)庫(kù)中不存在表結(jié)構(gòu),那么自動(dòng)創(chuàng)建表結(jié)構(gòu).如果存在表結(jié)構(gòu),并且表結(jié)構(gòu)與實(shí)體一致,那么不做修改如果存在表結(jié)構(gòu),并且表結(jié)構(gòu)與實(shí)體不一致,那么會(huì)修改表結(jié)構(gòu).會(huì)保留原有列.create(很少):無(wú)論是否存在表結(jié)構(gòu).每次啟動(dòng)Hibernate都會(huì)重新創(chuàng)建表結(jié)構(gòu).(數(shù)據(jù)會(huì)丟失)create-drop(極少): 無(wú)論是否存在表結(jié)構(gòu).每次啟動(dòng)Hibernate都會(huì)重新創(chuàng)建表結(jié)構(gòu).每次Hibernate運(yùn)行結(jié)束時(shí),刪除表結(jié)構(gòu).validate(很少):不會(huì)自動(dòng)創(chuàng)建表結(jié)構(gòu).也不會(huì)自動(dòng)維護(hù)表結(jié)構(gòu).Hibernate只校驗(yàn)表結(jié)構(gòu). 如果表結(jié)構(gòu)不一致將會(huì)拋出異常.--><property name="hbm2ddl.auto">update</property><!-- 數(shù)據(jù)庫(kù)方言配置org.hibernate.dialect.MySQLDialect (選擇最短的)--><property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property><!-- hibernate.connection.autocommit: 事務(wù)自動(dòng)提交<property name="hibernate.connection.autocommit">true</property>--><!-- 將Session與線程綁定=> 只有配置了該配置,才能使用getCurrentSession --><property name="hibernate.current_session_context_class">thread</property><!-- 引入ORM 映射文件填寫(xiě)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元數(shù)據(jù) 表對(duì)象關(guān)系映射文件package : 配置該配置文件中類所在的包. --> <hibernate-mapping package="com.huhu.domain"><!-- class: 配置實(shí)體與表的關(guān)系name : 填寫(xiě)實(shí)體的完整類名table: 與實(shí)體對(duì)應(yīng)表的名稱dynamic-insert:動(dòng)態(tài)插入 默認(rèn)值是falsetrue=>如果字段值為null,不參與insert語(yǔ)句dynamic-update:動(dòng)態(tài)更新 默認(rèn)值"false"true=> 沒(méi)改動(dòng)過(guò)的屬性,將不會(huì)生成到update語(yǔ)句中--><class name="com.huhu.domain.User" table="t_user"><!-- id: 配置實(shí)體與表中 id對(duì)應(yīng)name: user對(duì)象中標(biāo)識(shí)主鍵的屬性名稱column: 主鍵在表中的列名length: 列的數(shù)據(jù)長(zhǎng)度unsaved-value(不常用): 指定主鍵為什么值時(shí),當(dāng)做null來(lái)處理.access(強(qiáng)烈推薦不要用):field 那么在操作屬性時(shí),會(huì)直接操作對(duì)應(yīng)的字段而不是get/set方法--><id name="id" column="id"><!-- generator:主鍵生成策略1.increment 數(shù)據(jù)庫(kù)自己生成主鍵. 先從數(shù)據(jù)庫(kù)中查詢最大的ID值,將ID值加1作為新的主鍵2.identity 依賴于數(shù)據(jù)的主鍵自增功能3.sequence 序列,依賴于數(shù)據(jù)中的序列功能(Oracle).4.hilo(純了解,永遠(yuǎn)用不到) : Hibernate自己實(shí)現(xiàn)序列的算法,自己生成主鍵. (hilo算法 )5.native 自動(dòng)根據(jù)數(shù)據(jù)庫(kù)判斷,三選一. identity|sequence|hilo6.uuid 生成32位的不重復(fù)隨機(jī)字符串當(dāng)做主鍵7.assigned 自己指定主鍵值. 表的主鍵是自然主鍵時(shí)使用.--><generator class="native"></generator></id><!-- property : 實(shí)體中屬性與表中列的對(duì)應(yīng)name : 實(shí)體中屬性名稱column : 表中列的名稱length : 數(shù)據(jù)長(zhǎng)度precision: 小數(shù)點(diǎn)后的精度scale: 有效位數(shù)insert(一般不用): 該屬性是否加入insert語(yǔ)句.update(一般不用): 該屬性是否加入update語(yǔ)句.not-null : 指定屬性的約束是否使用 非空unique : 指定屬性的約束是否使用 唯一--><!--type: 表達(dá)該屬性的類型可以用三種方式指定屬性java類型 數(shù)據(jù)庫(kù)類型指定 Hibernate類型指定java.lang.String varchar string--><property name="name" column="name"></property><property name="password" column="password"></property></class> </hibernate-mapping> User
HibernateUtils
HibernateDemo1
package com.huhu.a_state;import com.huhu.domain.User; import com.huhu.utils.HibernateUtils; import org.hibernate.Session;/*** 對(duì)象的三種狀態(tài)*/ public class HibernateDemo1 {//三種狀態(tài)public void fun1() {Session session = HibernateUtils.openSession();session.beginTransaction();//--------------------------------------User u = new User(); //status : 瞬時(shí)狀態(tài)u.setName("tom"); //status : 瞬時(shí)狀態(tài)u.setPassword("1234"); //status : 瞬時(shí)狀態(tài)//保存session.save(u); //status : 持久狀態(tài)//調(diào)用save方法時(shí),數(shù)據(jù)庫(kù)有沒(méi)有對(duì)應(yīng)記錄//沒(méi)有記錄,但最終會(huì)被同步到數(shù)據(jù)庫(kù)中,仍時(shí)持久狀態(tài)//--------------------------------------session.getTransaction().commit(); //status : 持久狀態(tài)session.close(); //status : 游離狀態(tài)}// 三種狀態(tài)的轉(zhuǎn)換 瞬時(shí)=》持久public void fun2() {Session session = HibernateUtils.openSession();session.beginTransaction();//--------------------------------------User u = new User(); //status : 瞬時(shí)狀態(tài)u.setName("he"); //status : 瞬時(shí)狀態(tài)u.setPassword("123456"); //status : 瞬時(shí)狀態(tài)session.save(u); //status : 持久狀態(tài)//--------------------------------------session.getTransaction().commit(); //status : 持久狀態(tài)//事務(wù)提交時(shí)會(huì)把持久對(duì)象保存到數(shù)據(jù)庫(kù)//increment=>hibernate 自動(dòng)查詢最大id,然后生成主鍵//assigned =>自動(dòng)生成主鍵session.close();}// 瞬時(shí)=》游離 瞬時(shí):沒(méi)有關(guān)聯(lián)沒(méi)有id 游離:沒(méi)有關(guān)聯(lián)有id(與數(shù)據(jù)庫(kù)對(duì)應(yīng)的id)public void fun3() {Session session = HibernateUtils.openSession();session.beginTransaction();//--------------------------------------//status : 持久狀態(tài)User u = new User();u.setId(2); //此時(shí)為游離狀態(tài)//--------------------------------------session.getTransaction().commit(); //status : 持久狀態(tài)//事務(wù)提交時(shí)會(huì)把持久對(duì)象保存到數(shù)據(jù)庫(kù)session.close();}//持久=》瞬時(shí)1 持久:有關(guān)聯(lián),有id,瞬時(shí):無(wú)關(guān)聯(lián)無(wú)idpublic void fun4() {Session session = HibernateUtils.openSession();session.beginTransaction();//--------------------------------------//status : 持久狀態(tài)//通過(guò)get方法,得到持久狀態(tài)對(duì)象User u = (User) session.get(User.class, 2); //持久狀態(tài)//--------------------------------------session.getTransaction().commit();//事務(wù)提交時(shí)會(huì)把持久對(duì)象保存到數(shù)據(jù)庫(kù)session.close(); //游離狀態(tài)u.setId(null);}//持久=》瞬時(shí)1 持久:有關(guān)聯(lián),有id,瞬時(shí):無(wú)關(guān)聯(lián)無(wú)idpublic void fun5() {Session session = HibernateUtils.openSession();session.beginTransaction();//--------------------------------------//status : 持久狀態(tài)//通過(guò)get方法,得到持久狀態(tài)對(duì)象User u = (User) session.get(User.class, 4); //持久狀態(tài)session.evict(u); //將User對(duì)象和session的關(guān)聯(lián)移除u.setId(null); //瞬時(shí)對(duì)象//--------------------------------------session.getTransaction().commit();session.save(u);//事務(wù)提交時(shí)會(huì)把持久對(duì)象保存到數(shù)據(jù)庫(kù)session.close(); //游離狀態(tài)}// 持久=》游離 持久:有關(guān)聯(lián),有idpublic void fun6() {Session session = HibernateUtils.openSession();session.beginTransaction();//--------------------------------------//status : 持久狀態(tài)//通過(guò)get方法,得到持久狀態(tài)對(duì)象User u = (User) session.get(User.class, 4); //持久狀態(tài)session.evict(u); //將User對(duì)象和session的關(guān)聯(lián)移除//--------------------------------------session.getTransaction().commit(); //游離session.close(); //游離狀態(tài)}// 游離=》瞬時(shí) 瞬時(shí):無(wú)關(guān)聯(lián)無(wú)idpublic void fun7() {Session session = HibernateUtils.openSession();session.beginTransaction();//--------------------------------------//status : 持久狀態(tài)//通過(guò)get方法,得到持久狀態(tài)對(duì)象User u = (User) session.get(User.class, 4); //持久狀態(tài)session.evict(u); //瞬時(shí)u.setId(null); //瞬時(shí)//--------------------------------------session.getTransaction().commit(); //瞬時(shí)session.close(); //瞬時(shí)狀態(tài)}// 游離=》持久 是否與session關(guān)聯(lián)public void fun8() {Session session = HibernateUtils.openSession();session.beginTransaction();//--------------------------------------//status : 持久狀態(tài)//通過(guò)get方法,得到持久狀態(tài)對(duì)象User u = (User) session.get(User.class, 4); //持久狀態(tài)session.evict(u); //游離session.update(u); //持久//--------------------------------------session.getTransaction().commit(); //持久 打印updata語(yǔ)句session.close(); //瞬時(shí)狀態(tài)}public void fun9() {Session session = HibernateUtils.openSession();session.beginTransaction();//--------------------------------------////通過(guò)get方法,得到持久狀態(tài)對(duì)象User u = (User) session.get(User.class, 4);u.setName("nenen");//--------------------------------------session.getTransaction().commit();session.close(); //瞬時(shí)狀態(tài)}public static void main(String[] args) {HibernateDemo1 d = new HibernateDemo1();//d.fun1();d.fun9();} }?
代碼顯而易見(jiàn)。如果覺(jué)得不明顯再來(lái)一個(gè)圖吧。
?
總結(jié)下吧:
三種狀態(tài)有什么用:
1.持久狀態(tài):我們使用hibernate主要時(shí)為了持久化數(shù)據(jù)
2.對(duì)于對(duì)象的狀態(tài): 我們期望我們現(xiàn)需要同步到數(shù)據(jù)庫(kù)的數(shù)據(jù),都被轉(zhuǎn)化為持久化
持久話對(duì)象的特點(diǎn):hibernate會(huì)自動(dòng)將持久話對(duì)象的變化同步到數(shù)據(jù)庫(kù).
所以說(shuō)hibernate是一個(gè)面向?qū)ο蟮目蚣?#xff0c;利用對(duì)象的操作數(shù)據(jù)。
轉(zhuǎn)載于:https://www.cnblogs.com/meiLinYa/p/9143184.html
總結(jié)
以上是生活随笔為你收集整理的Hibernate---对象的三种状态的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 黄金英雄坛说电脑(黄金英雄坛说电脑版)
- 下一篇: IDEA项目搭建四——使用Mybatis