亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

hibernate持久化對象狀態

2019-11-09 15:33:25
字體:
來源:轉載
供稿:網友

瞬時對象(Transient Objects):使用new操作符初始化的對象不是立刻就持久化的。他們的狀態是瞬時的,也就是說他們沒有任何跟數據庫表相關聯的行為,只要應用不再引用這些對象(不再被任何其他對象所引用),他們的狀態將會丟失,并由垃圾回收機制回收。

臨時對象的特征。臨時對象具有以下特征:(1) 不處于session的緩存中,也可以說,不被任何一個Session實例關聯。(2) 在數據庫中沒有對應的記錄。在以下情況下,java對象進入臨時狀態:(1) 當通過new語句剛創建了一個Java對象,它處于臨時狀態,此時不和數據庫中的任何記錄對應。(2) Session的delete()方法能使一個持久化對象或游離對象轉變為臨時對象。對于游離對象,delete()方法從數據庫中刪除與它對應的記錄;對于持久化對象,delete()方法從數據庫中刪除與它對應的記錄,并且把它從Session的緩存中刪除。

持久化對象(Persist Objects):持久實例是任何具有數據庫標識的實例。它有持久化管理器Session統一管理,持久實例是在事務中進行操作的———他們的狀態在事務結束時同數據庫進行同步。當事務提交時,通過執行SQL的INSERT,UPDATE和DELETE語句把內存中的狀態同步到數據庫中。

持久化對象的特征。持久化對象具有以下特征:(1) 位于一個Session實例的緩存中,也可以說,持久化對象總是被一個Session實例關聯。(2) 持久化對象和數據庫中的相關記錄對應。(3) Session在清理緩存時,會根據持久化對象的屬性變化,來同步更新數據庫。Session的許多方法都能夠觸發Java對象進入持久化狀態:(1) Session的save()方法把臨時對象轉變為持久化對象。(2) Session的load()或get()方法返回的對象總是處于持久化狀態。(3) Session的find()方法返回的List集合中存放的都是持久化對象。(4) Session的update()、saveOrUpdate()和lock()方法使游離對象轉變為持久化對象。(5)當一個持久化對象關聯一個臨時對象,在允許級聯保存的情況下,Session在清理緩存時會把這個臨時對象也轉變為持久化對象。hibernate保證在同一個Session實例的緩存中,數據庫表中的每條記錄只對應惟一的持久化對象。例如對于以下代碼,共創建了兩個Session實例:session1和session2。session1和session2擁有各自的緩存。在session1的緩存中,只會有惟一的OID為1的Customer持久化對象,在session2的緩存中,也只會有惟一的OID為2的Customer持久化對象。因此在內存中共有兩個Customer持久化對象,一個屬于session1的緩存,一個屬于session2的緩存。引用變量a和b都引用session1緩存中的Customer持久化對象,而引用變量c引用session2緩存中的Customer持久化對象:Session session1=sessionFactory.openSession();Session session2=sessionFactory.openSession();Transaction tx1 = session1.beginTransaction();Transaction tx2 = session2.beginTransaction();

Customer a=(Customer)session1.load(Customer.class,new Long(1));Customer b=(Customer)session1.load(Customer.class,new Long(1));Customer c=(Customer)session2.load(Customer.class,new Long(1));

System.out.PRintln(a= =b); //trueSystem.out.println(a= =c); //false

tx1.commit();tx2.commit();session1.close();session2.close();Java對象的持久化狀態是相對于某個具體的Session實例的,以下代碼試圖使一個Java對象同時被兩個Session實例關聯:Session session1=sessionFactory.openSession();Session session2=sessionFactory.openSession();Transaction tx1 = session1.beginTransaction();Transaction tx2 = session2.beginTransaction();

Customer c=(Customer)session1.load(Customer.class,new Long(1)); //Customer對象被session1關聯session2.update(c); //Customer對象被session2關聯c.setName("Jack"); //修改Customer對象的屬性

tx1.commit(); //執行update語句tx2.commit(); //執行update語句session1.close();session2.close();

當執行session1的load()方法時,OID為1的Customer對象被加入到session1的緩存中,因此它是session1的持久化對象,此時它還沒有被session2關聯,因此相對于session2,它處于游離狀態。當執行session2的update()方法時,Customer對象被加入到session2的緩存中,因此也成為session2的持久化對象。接下來修改Customer對象的name屬性,會導致兩個Session實例在清理各自的緩存時,都執行相同的update語句:update CUSTOMERS set NAME='Jack' …… where ID=1;在實際應用程序中,應該避免一個Java對象同時被多個Session實例關聯,因為這會導致重復執行SQL語句,并且極容易出現一些并發問題。

離線對象(Detached Objects):Session關閉之后,持久化對象就變為離線對象。離線表示這個對象不能再與數據庫保持同步,他們不再受Hibernate管理。

游離對象的特征。游離對象具有以下特征:(1) 不再位于Session的緩存中,也可以說,游離對象不被Session關聯。(2) 游離對象是由持久化對象轉變過來的,因此在數據庫中可能還存在與它對應的記錄(前提條件是沒有其他程序刪除了這條記錄)。游離對象與臨時對象的相同之處在于,兩者都不被Session關聯,因此Hibernate不會保證它們的屬性變化與數據庫保持同步。游離對象與臨時對象的區別在于:前者是由持久化對象轉變過來的,因此可能在數據庫中還存在對應的記錄,而后者在數據庫中沒有對應的記錄。Session的以下方法使持久化對象轉變為游離對象:(1) 當調用Session的close()方法時,Session的緩存被清空,緩存中的所有持久化對象都變為游離對象。如果在應用程序中沒有引用變量引用這些游離對象,它們就會結束生命周期。(2)Session的evict()方法能夠從緩存中刪除一個持久化對象,使它變為游離狀態。當Session的緩存中保存了大量的持久化對象,會消耗許多內存空間,為了提高性能,可以考慮調用evict()方法,從緩存中刪除一些持久化對象。但是多數情況下不推薦使用evict()方法,而應該通過查詢語言,或者顯式的導航來控制對象圖的深度。

 

 

Java對象在JVM中的生命周期:

創建一個Java對象時,JVM會為這個對象分配一個內存空間,只要這個對象被引用變量引用,就一直存在于內存中,如果一個對象不被任何引用變量引用,就結束生命周期。Java集合(List、Map、Set)存放的是Java對象的引用,當向集合中添加一個對象時,其實是把這個對象的引用添加到集合中。因此集合中含有的對象生命周期一直存在。

 理解Session的緩存:

在Session接口的實現中定義一系列的Java集合,這些集合構成了Session的緩存。

Session緩存的作用:1、減少訪問數據庫的頻率,可以提高數據庫訪問的性能。2、保證緩存中的對象與數據庫中的相關記錄保持同步。3、當緩存中的持久化對象(位于緩存中的對象)之間存在循環關聯關系時,Sessioin會保證不出現訪問對象的死循環。

在Hibernate應用中Java對象的狀態:

臨時狀態(transient):剛用new語句創建,還沒有被持久化,不處于Session的緩存中。處于臨時狀態的Java對象稱為臨時對象。

持久化狀態(persistent):已經被持久化,加入到Session的緩存中。處于持久化狀態的Java對象稱為持久化對象。

游離狀態(detached):已經被持久化,但不再處于Session的緩存中。處于游離狀態的Java對象稱為游離對象。

Java對象:開始生命周期——》臨時狀態——》持久化狀態——》游離狀態——》結束生命周期

 

 Session的保存、更新、刪除、查詢方法:

1、Session的save()方法

session.save(customer);完成的操作:

(1)把Customer對象加載到緩存中,使它變為持久化對象。

(2)選用映射文件指定的標識符生成器為持久化對象分配唯一的OID。Customer.hbm.xml文件中<id>元素的<generator>子元素指定標識符生成器。

(3)計劃執行一個insert語句,把Customer對象當前的屬性值組裝到insert語句中。

insert into CUSTOMERS(ID, NAME, ......) values(1, "Tom", ......)

save()方法并不立即執行SQL insert語句。只有當Session清理緩存時,才會執行SQL語句。

2、Session的update()方法

session.update(customer);完成的操作:

(1)把Customer對象重新加入到Session緩存中,使它變為持久化對象。

(2)計劃執行一個update語句。Session只有在清理緩存時才會執行update語句,并且在執行時才會把Customer對象當前的屬性值組裝到update語句中。

(3)只要通過update()方法使游離對象被一個Session關聯,即使沒有修改Customer對象的任何屬性,Session在清理緩存時也會執行由update()方法計劃的update語句。

update CUSTOMERS set NAME="Tom", ...... where ID=1

如果希望Session僅當修改了Customer對象的屬性時,才執行update語句,可把映射文件Customer.hbm.xml中<class>元素的"select-before-update"設為true(該屬性默認為false)

<class name="mypack.Customer" table="CUSTOMERS" select-before-update="true">

當Session清理緩存時,先執行一條select語句,然后比較Customer對象的屬性是否和從數據庫中檢索出來的記錄一致,只有在不一致時才執行update語句。

3、Session的saveOrUpdate()方法

如果傳入的參數是臨時對象,就調用save()方法;如果傳入的參數是游離對象,就調用update()方法;如果傳入的參數是持久化對象,那就直接返回。

Hibernate判斷臨時對象的條件:

(1)Java對象的OID取值為null

(2)Java對象具有version屬性并且取值為null

(3)在映射文件中為<id>元素設置了unsaved-value屬性,并且OID取值與unsaved-value屬性只匹配

(4)在映射文件中為version屬性設置了unsaved-value屬性,并且version屬性取值與unsaved-value屬性值匹配

(5)自定義了Hibernate的Interceptor實現類,并且Interceptor的isUnsaved()方法返回Boolean.TRUE

4、Session的load()方法和get()方法

根據給定的OID從數據庫中加載一個持久化對象。

當數據庫中不存在與OID對應的記錄時

load()方法,返回ObjectNotFoundException異常

get()方法,返回null。

5、Session的delete()方法

如果傳入的參數是持久化對象,Session就計劃執行一個delete語句;如果傳入的參數是游離對象,先使游離對象被Session關聯,使它變為持久化對象,然后計劃執行一個delete語句。

Session只有在清理緩存的時候才會執行delete語句。只有當調用Session的close()方法時,才會從Session的緩存中刪除該對象。

session.delete(customer);

session.delete("from Customer as c where c.id>8");

級聯操縱對象圖

在對象-關系關聯映射文件中,用于映射持久化類之間關聯關系的元素<set>、<many-to-one>、<one-to-one>有cascade屬性,用于指定如何操縱與當前對象關聯的其他對象。

cascade屬性可選值:none、save-update、delete、all、delete-orphan、all-delete-orphan

Hibernate與觸發器協同工作

能激發觸發器運行的事件:

插入(insert)記錄事件、更新(update)記錄事件、刪除(delete)記錄事件

 利用攔截器(Interceptor)生成審計日志

用戶定義的攔截器必須實現org.hibernate.Interceptor接口。

Interceptor對象有兩種存放方式:

SessionFactory.openSession(Interceptor):為每個Session實例分配一個Interceptor實例,這個實例存放在Session范圍內。

Configuration.setInterceptor(Interceptor):為SessionFactory實例分配一個Interceptor實例,這個實例存放在SessionFactory范圍內,被所有Session實例共享。

 

 

 

操縱持久化對象

 

1.   理解Session的緩存:在Java里面,緩存通常是指Java對象的屬性占用的內存空間,通常是一些集合類型的屬性。在session接口的實現類SessionImpl中定義了一系列的Java集合,這些Java集合就構成了Session的緩存。當Session的save()方法持久化一個對象時,這個對象被加入到Session的緩存中,以后即使應用程序中的引用變量不再引用這個對象,只要Session的緩存還沒有被清空,這個對象仍然處于生命周期中。當Session的load()方法加載一個對象時,Session會先判斷緩存中是否已經存在這個對象了,如果存在,就不需要再到數據庫中重新加載了。Session的緩存有兩大作用:1.1.       減少訪問數據庫的頻率。1.2.       保證緩存中的對象與數據庫中的相關記錄保持同步。Session有兩個方法:一個commit()事務提交方法,還有flush()刷新緩存方法,都有著清理緩存的作用。flush()進行緩存的清理,執行一系列的SQL語句,但不會提交事務。而commit()方法會先調用flush()方法,然后在提交事務。2.   定義持久化類的建議:在應用程序中,用來實現業務問題實體的(如,在電子商務應用程序中的Customer和Order) 類就是持久化類。如果這些持久化類遵循一些簡單的規則,Hibernate能夠工作得更好,這些規則也被稱作簡單傳統Java對象(POJO:Plain Old Java Object)編程模型。但是這些規則并不是必需的。最好要遵循以下幾條主要的規則:1)     實現一個默認的(即無參數的)構造方法(constructor):我們強烈建議,在Hibernate中,為了運行期代理的生成,構造方法至少是包(package)內可見的。2)     提供一個標識屬性(identifier property):我們建議你對持久化類聲明命名一致的標識屬性。我們還建議你使用一個可以為空(也就是說,不是原始類型)的類型。3)     使用非final的類:代理(proxies)是Hibernate的一個重要的功能,它依賴的條件是,持久 化類或者是非final的,或者是實現了一個所有方法都聲明為public的接口。你也應該避免在非final類中聲明public final的方法。4)     為持久化字段聲明訪問器(accessors):5)     如果你有如下需求,你必須重載 equals() 和 hashCode()方法:l 想把持久類的實例放入Set中(當表示多值關聯時,推薦這么做)l 想重用脫管實例Hibernate保證,僅在特定會話范圍內,持久化標識(數據庫的行)和Java標識是等價的。因此,一旦 我們混合了從不同會話中獲取的實例,如果希望Set有明確的語義,就必須實現equals() 和hashCode()。3.   持久化對象的三種狀態:一個持久化類的實例可能處于三種不同狀態中的某一種。3.1.   瞬時(transient)狀態:該實例是剛用new語句創建的,還沒有被持久化,不處于任何Session的緩存中。它沒有持久化標識(相當于主鍵值)。處于瞬時狀態的實例被稱為瞬時對象。它的特點是:不和任何一個Session實例關聯。在數據庫中沒有對應的記錄。3.2.   持久化(persistent)狀態:已經被持久化,加入到Session緩存中。處于持久化狀態的實例被稱為持久化對象。實例目前與某個Session有關聯。 它擁有持久化標識(相當于主鍵值),并且可能在數據庫中有一個對應的行。 Hibernate保證在同一個Sesion實例的緩存中,數據庫中的每條記錄只對應唯一的持久化對象。 它的特點是:       持久化對象總是被一個Session實例關聯。持久化對象和數據庫中的相關記錄對應。Session在清理緩存時,會根據持久化對象的屬性變化,來同步更新數據庫。3.3.   脫管(detached)狀態:已經被持久化過,但不再處于Session的緩存中。處于脫管狀態的實例被稱為脫管對象。實例曾經與某個持久化上下文發生過關聯,不過那個上下文被關閉了, 或者這個實例是被序列化(serialize)到另外的進程。 它擁有持久化標識,并且在數據庫中可能存在一個對應的行。 對于脫管狀態的實例,Hibernate不保證任何持久化標識和Java標識的關系。它的特點是:不再位于session的緩存中,即它不再和session關聯。它擁有持久化標識。  4.   Session的保存、刪除、更新和查詢方法:4.1.   Session的save()方法:使用一個臨時對象轉變為持久對象。方法簽名:public Serializable save(Object object) throws HibernateException; 它完成以下操作:1)     把持久化類的實例加入到緩存中,使它變為持久化對象。2)     選用映射文件指定的標識符生成器為持久化對象分配唯一的OID。3)     計劃執行一個insert語句,把持久化對象當前的屬性值組裝到insert 語句(SQL DML)中。值得注意的是,save()方法并不是立即執行SQL insert語句。只有當Session清理緩存時,才會執行SQL insert語句。另外,需要注意的是:Hibernate通過持久化對象的OID來維持它和數據庫相關記錄的對應關系。所以當持久化的實例處于持久化狀態時,不允許程序隨意修改它的OID。其實,無論java對象處于瞬時狀態、持久化狀態還是脫管狀態,程序都不應該修改它的OID。4.2.   Session的update()方法:使一個脫管對象轉變為持久化對象。方法簽名:public void update(Object object) throws HibernateException; 它完成以下操作:1)     把脫管對象重新加入到Session緩存中,使它變為持久化對象。2)     計劃執行一個update語句。值得注意的是,Session只有在清理緩存的時候才會執行update語句,并且在執行時才會把持久化對象當前的屬性值組裝到update語句中。4.3.   Session的saveOrUpdate()方法:       方法簽名:public void saveOrUpdate(Object object) throws HibernateException ; saveOrUpdate()方法同時包含了save()與update()方法的功能,如果傳入的參數是瞬時對象,就調用save()方法;如果傳入的參數是脫管對象,就調用update()方法;如果傳入的參數是持久化對象,方法就直接返回。那么,saveOrUpdate()方法如果判斷一個對象處于瞬時狀態不是脫管狀態呢?如果滿足以下情況之一,Hibernate就把它作為臨時對象:1)     Java對象的OID取值為null。2)     Java對象具有version屬性,并且取值了null。3)     在映射文件中為<id>元素設置了unsaved-value屬性,并且OID取值與unsaved-value屬性值匹配。4)     在映射文件中為<version>元素設置了unsaved-value屬性,并且version屬性取值與unsaved-value屬性值匹配。5)     自定義了Hibernate的Interceptor實現類,并且Interceptor的isUnsaved()方法返回Boolean.TRUE。4.4.   Session的delete()方法:方法簽名:public void delete(Object object) throws HibernateException; delete()方法用于從數據庫中刪除與Java對象對應的記錄。如果傳入的參數是持久化對象,Session就計劃執行一個delete語句。如果傳入的參數是游離對象,先使游離對象被Session關聯,使它變為持久化對象,然后計劃執行一個delete語句。值得注意的也是,Session只有在清理緩存的時候才會執行delete語句。5.   通過主鍵ID取得數據對象:5.1.   Session的get()方法:       方法簽名:public Object get(Class clazz, Serializable id) throws HibernateException; 根據給定的OID從數據庫中加載一個持久化對象,若數據庫中不存在與OID對應的記錄,此方法返回null。       get()方法的執行順序如下:1)     首先通過id在session緩存中查找對象,如果存在此id主鍵值的對象,直接將其返回。如果不存在,將進行第2步。2)     在二級緩存中查找,找到后將其返回。3)     如果在session緩存和二級緩存中都找不到此對象,剛從數據庫加載擁有此id的對象。如果數據庫也不存在這個擁有此id的對象,則返回null。5.2.   Session的load()方法:方法簽名:public Object load(Class theClass, Serializable id) throws HibernateException; 根據給定的OID從數據庫中加載一個持久化對象,若數據庫中不存在與OID對應的記錄,此方法將拋出org.hibernate.ObjectNotFoundException異常。對于get和load的根本區別,一句話,hibernate對于load方法認為該數據在數據庫中一定存在,可以放心的使用代理來延遲加載,如果在使用過程中發現了問題,只能拋異常;而對于get方法,hibernate一定要獲取到真實的數據,否則返回null。6.   Query接口:Hibernate提供Query接口,它用來執行HQL語句。6.1.   綁定參數6.1.1.      使用 “?”按參數位置綁定:通過Query接口執行HQL語句時,可以先設定查詢參數,然后通過setXXX()方法來綁定參數。如下

Query query = session.createQuery("from User as u where u.age > ? and u.name like ?");query.setInteger(0, 25);query.setString(1, "%a%");List list = query.list();

Hibernate提供了綁定各種類型的參數的方法,如參數為字符串類型,可調用setString(),如果參數為整數類型,可調用setInteger()方法,以此類推。這些setXXX()方法的第1個參數HQL查詢語句中參數的位置,第2個參數代表HQL查詢語句中參數的值。6.1.2.      使用 “:” 后跟變量名來按命名參數綁定:可以使用命名參數來取代使用“?”設置參數的方法,這可以不用依照特定的順序來設定參數值,如上例可改成:

Query query = session.createQuery("from User as u where u.age > :minAge and u.name like likeName");query.setInteger("minAge", 25);query.setString("likeName", "%a%");List list = query.list();

使用命名參數方式的綁定方式有以下優勢:1)     代碼可讀性更好。2)     命名參數不依賴它們在查詢字符串中出現的位置。3)     在同一個查詢中可以多次使用。所以,應該優先考慮使用命名參數方式。6.2.   使用命名查詢(nameQuery):可以將HQL語句編寫在程序之外,以避免硬編碼在程序之中,這樣要修改HQL語句時就很方便。在xxx.hbm.xml中使用<qiuery/>標簽,并在<![CDATA[ 與 ]]> 之間編寫HQL,如下Student.hbm.xml:

......<hibernate-mapping>   <classname="org.qiujy.demo.User"table="user">       <idname="id"column="id"type="java.lang.Integer">           <generatorclass="native"/>       </id>       <propertyname="name"column="name"type="java.lang.String"/>       <propertyname="age"column="age"type="java.lang.Integer"/>   </class><query name="queryUserByAgeAndName">    <![CDATA[    from User as u where u.age >:minAge and u.name like :likeName]]></query></hibernate-mapping>

在代碼中這樣來調用:

Query query = session.getNamedQuery("queryUserByAgeAndName");query.setInteger("minAge", 25);query.setString("likeName", "%a%");List list = query.list();

6.3.   Query接口的list()方法:Query接口的list()方法用于取得一個List類的實例,此實例中包括的可能是一個對象集合,也可能是一個對象數組集合。最常見的使用是用list()方法來取得一組符合實例對象。如上示例。6.4.   Query接口的uniqueResult()方法:當確信使用的HQL語句查詢時返回的集合中只有一個對象時,就可以使用這個方法。但如果返回結果中有多個對象,使用這個方法會拋出org.hibernate.NonUniqueResultException 異常,說“query did not return a unique result”。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
午夜精品理论片| 日本精品一区二区三区在线播放视频| 欧美亚洲成人精品| 欧美电影在线观看高清| 国产精品一区二区三区久久久| 91青草视频久久| 国产日韩综合一区二区性色av| 在线观看亚洲视频| 久久99精品久久久久久噜噜| 欧美极品欧美精品欧美视频| 亚洲日韩欧美视频| 欧美日韩裸体免费视频| 成人福利在线观看| 精品久久久久久亚洲精品| 精品国产1区2区| 欧美日韩国产丝袜美女| 亚洲激情免费观看| 欧美日韩在线免费| 精品久久久在线观看| 欧美亚洲另类在线| 一本色道久久88综合亚洲精品ⅰ| 精品亚洲国产视频| 成人免费福利视频| 国产成人av网址| 中文字幕亚洲欧美日韩2019| 久久视频在线免费观看| 在线电影av不卡网址| 精品国产一区二区三区久久久| 亚洲欧美国产精品专区久久| 久久综合亚洲社区| 亚洲白拍色综合图区| 555www成人网| 日韩激情视频在线播放| 蜜月aⅴ免费一区二区三区| 91精品国产91久久久| 欧美激情在线狂野欧美精品| 欧美天堂在线观看| 欧美精品福利视频| 国产成人精品日本亚洲专区61| 在线观看日韩av| 九九精品在线观看| 亚洲春色另类小说| 国产亚洲欧美日韩精品| 亚洲一二在线观看| 久久综合免费视频影院| 亚洲品质视频自拍网| 九九热精品视频国产| 欧美丝袜一区二区| 成人在线视频网站| 亚洲视频欧美视频| 日韩av在线网址| 一区二区成人精品| 成人黄色免费网站在线观看| 最近2019免费中文字幕视频三| 国产精品久久久久久久久借妻| 欧洲亚洲免费视频| 91九色国产视频| 亚洲黄色av女优在线观看| 亚洲国模精品一区| 日韩av快播网址| 国产成人在线亚洲欧美| 欧美乱人伦中文字幕在线| 日韩专区在线观看| 亚洲女人被黑人巨大进入| 26uuu国产精品视频| 在线电影欧美日韩一区二区私密| 亚洲成人xxx| 国产午夜精品一区理论片飘花| 亚洲国产一区二区三区在线观看| 亚洲欧美日韩国产中文专区| 日本不卡高字幕在线2019| 欧美午夜激情小视频| 国产精品男女猛烈高潮激情| 精品国产欧美一区二区五十路| 日韩免费看的电影电视剧大全| 日韩美女中文字幕| 日韩免费观看av| 欧洲亚洲女同hd| 欧美成人高清视频| 中文字幕在线成人| 久久中国妇女中文字幕| 91av在线免费观看视频| 国产综合视频在线观看| 久久视频中文字幕| 欧洲成人在线视频| 日韩成人在线电影网| 国产裸体写真av一区二区| 日韩欧美在线视频免费观看| 九九热99久久久国产盗摄| 欧美在线一级va免费观看| 亚洲va国产va天堂va久久| 欧美精品18videos性欧美| 久久久久久久久久久久久久久久久久av| 久久久99久久精品女同性| 国产一区欧美二区三区| 亚洲色在线视频| 欧美精品亚州精品| 这里只有精品久久| 国产精品免费久久久| 日本精品一区二区三区在线| 久久久久成人网| 国产欧美va欧美va香蕉在线| 91精品久久久久久久久中文字幕| 久久精品99国产精品酒店日本| 日韩欧美在线网址| 国产婷婷成人久久av免费高清| 91日本视频在线| 综合激情国产一区| 538国产精品视频一区二区| 最近免费中文字幕视频2019| 一区二区三区四区在线观看视频| 亚洲国产欧美一区二区丝袜黑人| 日本高清视频精品| 国产精品中文字幕久久久| 国产亚洲精品美女久久久| 亚洲国产精品系列| 久久人人爽人人爽人人片亚洲| 久久久久久久久爱| 高清一区二区三区四区五区| 亚洲一区二区国产| 亚洲午夜国产成人av电影男同| 欧美一区二区大胆人体摄影专业网站| 国产精品福利观看| xxxx欧美18另类的高清| 国产精品丝袜高跟| 亚洲sss综合天堂久久| 欧美日韩国产一区在线| 欧美小视频在线| 亚洲欧美日韩中文在线制服| 97在线视频免费播放| 亚洲一区二区在线| 国产主播欧美精品| 欧美激情视频在线| 色综合伊人色综合网站| 日韩精品免费视频| 亚洲欧美日韩中文视频| 中文字幕亚洲综合久久| 亚洲视屏在线播放| www.久久草.com| 国产成人av在线| 欧美与欧洲交xxxx免费观看| 国产美女久久精品香蕉69| 亚洲午夜国产成人av电影男同| 狠狠躁夜夜躁久久躁别揉| 欧美重口另类videos人妖| 另类少妇人与禽zozz0性伦| 91亚洲人电影| 国产成人综合av| 日韩精品中文字幕在线播放| 日韩亚洲国产中文字幕| 国产日韩欧美视频| 欧美肥老太性生活视频| 日韩免费在线观看视频| 国产精品久久视频| 91丝袜美腿美女视频网站| 久久99热精品这里久久精品| 亚洲成人网久久久| 国产精品国模在线| 久久久久久午夜| 51精品在线观看| 欧美在线视频导航| 91精品免费久久久久久久久| 亚洲图中文字幕| 欧美疯狂xxxx大交乱88av|