精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

使用帶有Kotlin的JPA(Hibernate)的優秀實踐

譯文
開發 前端
本文將和您討論,作為JPA的經典實現—Hibernate,是如何避免各種常見的錯誤,以及各種與Kotlin有關的優秀實踐。

[[413599]]

【51CTO.com快譯】作為適合多平臺應用的靜態編程語言,Kotlin比Java更簡潔、更有表現力、也更具有代碼的安全性。同時,Kotlin提供了與Java的無縫互操作性。也就是說,Java允許開發人員將他們的項目遷移到Kotlin處,而無需重寫整個代碼庫。當然,針對此類遷移,我們可能需要在Kotlin應用中使用JPA(Java Persistence API)。雖然許多開發者普遍認為:沒有JPA,就不存在實體。但是他們在Kotlin中定義JPA時,往往會遇到各種警告。下面,我們來一起討論:作為JPA的經典實現—Hibernate,是如何避免各種常見的錯誤,并充分利用Kotlin的。

JPA實體的各項規則

注意,此處的實體并非常規的數據傳輸對象(Data Transfer Object,DTO)。為了能夠順暢運行,實體需要得到正確地定義。鏈接中詳細闡述了針對JPA的一系列規范和限制。其中最重要的是如下兩項:

  • 實體類雖然可以擁有其他構造函數,但是必須具有一個無參數(no-arg)的構造函數。而且這個無參數構造函數必須是公共的(public)或受保護的(protected)。
  • 實體類的任何方法、或持久性實例變量,都不能為final類型。

上述規范足以讓實體類運行起來。不過為了使之更流暢地運行,我們需要附加如下兩條規則:

  • 只有在明確的請求時,所有Lasy關聯才能被加載。否則,我們可能會遇到LazyInitializationException、或各種意外的性能問題。
  • equals()和hashCode()的實現,必須考慮到實體的可變特性。

無參數的構造函數

主構造函數(Primary constructors)是Kotlin最受歡迎的特性之一。然而,主構造函數在被加入的同時,替換了原有的默認函數。因此,如果您在Hibernate中使用它,則可能會碰到諸如:org.hibernate.InstantiationException: No default constructor for entity的異常。

那么為了解決此問題,您可以在所有實體中,手動定義無參數的構造函數。同時,您最好使用kotlin-jpa編譯器插件,來確保在字節碼中,為每個JPA定義相關的類,如:@Entity、@MappedSuperclass或@Embeddable,生成無參數的構造函數。

若想啟用該插件,您只需將其添加到kotlin-maven-plugin和compilerPlugins的依賴關系中即可,請參見如下代碼段:

  1. <plugin> 
  2.    <groupId>org.jetbrains.kotlin</groupId> 
  3.    <artifactId>kotlin-maven-plugin</artifactId> 
  4.    <configuration> 
  5.        <compilerPlugins> 
  6.            ... 
  7.            <plugin>jpa</plugin> 
  8.            ... 
  9.        </compilerPlugins> 
  10.    </configuration> 
  11.    <dependencies> 
  12.        ... 
  13.        <dependency> 
  14.            <groupId>org.jetbrains.kotlin</groupId> 
  15.            <artifactId>kotlin-maven-noarg</artifactId> 
  16.            <version>${kotlin.version}</version> 
  17.        </dependency> 
  18.        ... 
  19.    </dependencies> 
  20. </plugin> 

與之對應的在Gradle(譯者注:一個基于Apache Ant和Apache Maven概念的項目自動化構建開源工具)中的代碼段為:

  1. buildscript { 
  2.     dependencies { 
  3.         classpath "org.jetbrains.kotlin:kotlin-noarg:$kotlin_version" 
  4.     } 
  5. apply plugin: "kotlin-jpa" 

打開各種類和屬性

根據JPA規范,所有與JPA相關的類和屬性都必須是open的。不過,某些JPA提供程序可能不會強制執行該規范。例如,Hibernate在遇到最終實體類時,是不會拋出異常的。然而,由于final類無法被子類化(subclassed),因此Hibernate的代理機制會就此關閉。而沒有了代理,又何談lazy加載呢?而且,由于程序急需獲取所有的ToOne關聯,因此它很可能會導致嚴重的性能問題。

不過,對于使用靜態編織(static weaving)的EclipseLink而言,情況則不同,畢竟它的lazy加載機制并不會用到子類化。

如下代碼段所示,與Java不同的是,在Kotlin中,所有的類、屬性、以及方法,默認都是final類型的。您必須將它們明確地標記為open:

  1. @Table(name = "project"
  2. @Entity 
  3. open class Project { 
  4.     @Id 
  5.     @GeneratedValue(strategy = GenerationType.IDENTITY) 
  6.     @Column(name = "id", nullable = false
  7.     open var id: Long? = null 
  8.     @Column(name = "name", nullable = false
  9.     open var name: String? = null 
  10.     ... 

或者如下面的代碼段所示,您最好使用全開放(all-open)式的編譯器插件(https://kotlinlang.org/docs/all-open-plugin.html),來默認開啟所有與JPA相關的類和屬性。通過正確的配置,它能夠適用于所有被注釋為@Entity、 @MappedSuperclass、以及@Embeddable的類:

  1. <plugin> 
  2.    <groupId>org.jetbrains.kotlin</groupId> 
  3.    <artifactId>kotlin-maven-plugin</artifactId> 
  4.    <configuration> 
  5.        <compilerPlugins> 
  6.            ... 
  7.            <plugin>all-open</plugin> 
  8.        </compilerPlugins> 
  9.        <pluginOptions> 
  10.            <option>all-open:annotation=javax.persistence.Entity</option
  11.            <option>all-open:annotation=javax.persistence.MappedSuperclass</option
  12.            <option>all-open:annotation=javax.persistence.Embeddable</option
  13.        </pluginOptions> 
  14.    </configuration> 
  15.    <dependencies> 
  16.        <dependency> 
  17.            <groupId>org.jetbrains.kotlin</groupId> 
  18.            <artifactId>kotlin-maven-allopen</artifactId> 
  19.            <version>${kotlin.version}</version> 
  20.        </dependency> 
  21.    </dependencies> 
  22. </plugin> 

與之對應的在Gradle中的代碼段為:

  1. buildscript { 
  2.     dependencies { 
  3.         classpath "org.jetbrains.kotlin:kotlin-allopen:$kotlin_version" 
  4.     } 
  5. apply plugin: "kotlin-allopen" 
  6. allOpen { 
  7.     annotations("javax.persistence.Entity""javax.persistence.MappedSuperclass""javax.persistence.Embedabble"

針對JPA實體使用各種數據類

數據類(Data classes)是專為DTO設計的一項超棒的Kotlin功能。它被默認設計、并配備了各種非常實用的針對equals()、hashCode()、以及toString()的實現。不過,此類實現并不太適合JPA實體。其原因在于,雖然數據類被設計為final類,但是它不能夠像Kotlin那樣被標記為open。因此,為了適用于實體,而將它們標記為open的唯一方法便是,啟用全開放式的編譯器插件。

如下代碼段所示,我們將使用以下實體,來進一步檢查數據類。它帶有一個已生成的id、一個name屬性、以及兩個lazy的OneToMany關聯:

  1. @Table(name = "client"
  2. @Entity 
  3. data class Client( 
  4.    @Id 
  5.    @GeneratedValue(strategy = GenerationType.IDENTITY) 
  6.    @Column(name = "id", nullable = false
  7.    var id: Long? = null
  8.    @Column(name = "name", nullable = false
  9.    var name: String? = null
  10.    @OneToMany(mappedBy = "client", orphanRemoval = true
  11.    var projects: MutableSet<Project> = mutableSetOf(), 
  12.    @JoinColumn(name = "client_id"
  13.    @OneToMany 
  14.    var contacts: MutableSet<Contact> = mutableSetOf(), 

意外獲取LAZY關聯

默認情況下,所有ToMany關聯都是lazy的,其原因在于:非必要地加載它們,往往很容易會影響到程序性能。例如,equals()、hashCode()、以及toString()在實現的過程中,通常會用到包括lazy在內的所有屬性。因此,調用它們會導致向數據庫產生不需要的請求、以及出現LazyInitializationException。而且,數據類的默認行為是:在其方法中,使用來自主構造函數的所有字段。

在此,我們可以使用IDE來生成toString(),以通過簡單的覆蓋方式,排除所有的LAZY字段。如下代碼段所示,由于JPA Buddy有著自己的toString()產生機制,因此它完全不會提供LAZY字段。

  1. @Override 
  2. override fun toString(): String { 
  3.    return this::class.simpleName + "(id = $id , name = $name )" 

當然,僅從equals()和hashCode()中排除LAZY字段是遠遠不夠的,畢竟它們可能仍然包含著可變的屬性。

Equals()和HashCode()的問題

由于JPA實體在本質上是可變的,因此為其實現equals()和hashCode(),并不像常規的DTO那么簡單。某些實體的id甚至都是由數據庫所生成的,因此id會在實體首次被持久化后發生變化。這就意味著我們將沒有可依賴的字段,去計算hashCode。

下面,讓我們對Client實體進行一個簡單的測試。

  1. val awesomeClient = Client(name = "Awesome client"
  2. val hashSet = hashSetOf(awesomeClient) 
  3. clientRepository.save(awesomeClient) 
  4. assertTrue(awesomeClient in hashSet) 

如上面的代碼段所說,即便該實體被添加到前面幾行的集合中,它的最后一行斷言也會出現錯誤。畢竟,id在被首次生成時,hashCode就會發生改變。這就導致了HashSet在不同的存儲桶中是無法查找到該實體的。可見,如果id是在實體對象的創建期間被設置的(例如,是由應用程序設置的UUID),那么就不會出現問題;而如果是由數據庫生成的id(其實更為常見),就會出現上述問題。

對此,我們可以在使用實體的數據類時,持續性地覆蓋equals()和hashCode()。如果您想詳細地了解具體使用方法,請參見--https://vladmihalcea.com/the-best-way-to-implement-equals-hashcode-and-tostring-with-jpa-and-hibernate/。其中,對于Client實體而言,其對應的代碼段為:

  1. override fun equals(other: Any?): Boolean { 
  2.    if (this === other) return true 
  3.    if (other == null ||Hibernate.getClass(this) !=Hibernate.getClass(other)) return false 
  4.    other as Client 
  5.    return id != null && id == other.id 
  6. override fun hashCode(): Int = 1756406093 

使用由應用程序設置的ID

其實,數據類的各種方法主要是由主構造函數中那些指定的字段所生成的。如果只包含了eager immutable字段,那么數據類就不會存在上述問題。如下代碼段展示了由應用程序設置的不可變id的字段:

  1. @Table(name = "contact"
  2. @Entity 
  3. data class Contact( 
  4.    @Id 
  5.    @Column(name = "id", nullable = false
  6.    val id: UUID, 
  7. ) { 
  8.    @Column(name = "email", nullable = false
  9.    val email: String? = null 
  10.    // other properties omitted 

如果您更喜歡使用由數據庫來生成id的話,則可以參照如下代碼段,以實現在構造函數中使用不可變的自然id:

  1. @Table(name = "contact"
  2. @Entity 
  3. data class Contact( 
  4.    @NaturalId 
  5.    @Column(name = "email", nullable = false, updatable = false
  6.    val email: String 
  7. ) { 
  8.    @Id 
  9.    @GeneratedValue(strategy = GenerationType.IDENTITY) 
  10.    @Column(name = "id", nullable = false
  11.    var id: Long? = null 
  12.    
  13.    // other properties omitted 

雖然您可以放心地使用上述方法,但是它幾乎違背了使用數據類的初衷。畢竟,該用法不但讓分解(decomposition)變得無效,而且讓toString()對于實體而言,還不如直接使用普通的舊類。

空指針安全性(null-safety)

Kotlin相對于Java的一項優勢便是,內置有空指針安全性的功能。我們可以通過非空約束(non-null constraints)在數據庫端確保空指針的安全性。其最簡單的實現方法為,在主構造函數中使用非空類型,來定義各種非空的屬性(請參考如下代碼段):

  1. @Table(name"contact"
  2. @Entity 
  3. class Contact( 
  4.    @NaturalId 
  5.    @Column(name = "email", nullable = false, updatable = false
  6.    val email: String, 
  7.    @Column(name = "name", nullable = false
  8.    var name: String 
  9.    @ManyToOne(fetch = FetchType.LAZY, optional = false
  10.    @JoinColumn(name = "client_id", nullable = false
  11.    var client: Client 
  12. ) { 
  13.    // id and other properties omitted 

當然,如果您需要從構造函數中(例如:在數據類中)排除它們,則可以提供默認值,或將lateinit的修飾符添加到其屬性之中(請參考如下代碼段):

  1. @Entity 
  2. data class Contact( 
  3.    @NaturalId 
  4.    @Column(name = "email", nullable = false, updatable = false
  5.    val email: String, 
  6. ) { 
  7.    @Column(name = "name", nullable = false
  8.    var name: String = "" 
  9.    @ManyToOne(fetch = FetchType.LAZY, optional = false
  10.    @JoinColumn(name = "client_id", nullable = false
  11.    lateinit var client: Client 
  12.    // id and other properties omitted 

據此,如果該屬性在數據庫中被確認為非空,那么我們便可以省略在Kotlin代碼中,對于所有空值的檢查。

小結

讓我們通過如下列表,一起來總結一下如何在Kotlin中定義JPA實體:

  • 請將所有與JPA相關的類、及其屬性標記為open,以避免出現顯著的性能問題。
  • 為ManytoOne和OnetoOne關聯開啟lazy加載,或者將全開放式的編譯器插件,應用到所有被注釋為@Entity、@MappedSuperclass、以及@Embeddable的類。
  • 為了避免出現InstantiationException,請在所有與JPA相關的類中,定義無參數的構造函數,或使用kotlin-jpa編譯器插件。
  • 通過啟用全開放式的插件,在已編譯的字節碼中創建數據類,并使之具有open屬性。
  • 覆蓋equals()、hashCode()、以及toString()。
  • 讓JPA Buddy生成諸如:equals()、hashCode()、以及toString()等有效的實體。

此外,如果您想深入研究此類實踐,請通過鏈接,參考我們在GitHub存儲庫中為您準備的帶有測試的示例。

原文標題:Best Practices of Using JPA(Hibernate) With Kotlin,作者:Andrey Oganesyan

【51CTO譯稿,合作站點轉載請注明原文譯者和出處為51CTO.com】

責任編輯:華軒 來源: 51CTO
相關推薦

2022-08-19 09:01:59

ReactTS類型

2009-06-19 18:36:15

JPAHibernate

2023-10-07 16:20:34

JavaAPI

2009-06-02 11:25:22

HibernateJPA映射

2022-04-28 08:05:05

數據庫數據庫交互

2024-06-12 13:57:00

2022-03-05 23:08:14

開源軟件開發技術

2019-09-17 09:44:45

DockerHTMLPython

2019-11-27 10:55:36

云遷移云計算云平臺

2021-04-15 08:08:48

微前端Web開發

2022-06-27 10:05:09

物聯網安全UPS網絡安全

2021-07-06 14:17:16

MLOps機器學習AI

2022-12-21 08:20:01

2021-08-17 15:00:10

BEC攻擊網絡攻擊郵件安全

2020-03-09 14:10:48

代碼開發工具

2021-10-06 23:31:45

HibernateJPASpring Data

2023-08-10 17:40:33

人工智能

2022-04-07 09:30:00

自動化LinodeKubernetes

2019-01-17 10:25:56

Python編程語言程序員

2023-06-29 00:19:51

點贊
收藏

51CTO技術棧公眾號

欧美性猛交xxxx乱大交3| 国产美女久久精品| 国产又黄又猛又粗又爽的视频| 黄色在线播放| 国产精品99久久久久久有的能看 | 日韩欧美亚洲系列| 青娱乐精品在线视频| 九色精品美女在线| 免费看黄色av| 北条麻妃一区二区三区在线观看 | 欧美中文一区| 69av一区二区三区| 精品www久久久久奶水| 国产在线二区| 久久精品亚洲精品国产欧美kt∨ | 黄色三级视频片| av中文字幕在线观看| 久久久久久免费网| 国产精品久久久久久久久婷婷| 日本欧美www| 精品福利电影| 久热精品视频在线观看一区| 国产 欧美 在线| 91在线一区| 67194成人在线观看| 日韩视频在线免费看| 欧美理论片在线播放| 国产精品理伦片| 欧美日韩无遮挡| 污污的视频网站在线观看| 国产精品一区二区你懂的| 国产精品电影网| 日韩在线 中文字幕| 99在线|亚洲一区二区| 久久在精品线影院精品国产| 人妻熟人中文字幕一区二区| 蜜桃一区二区| 亚洲国模精品一区| 国偷自产av一区二区三区麻豆| 热久久久久久| 欧美美女一区二区在线观看| 九九热免费精品视频| www.成人影院| 日本福利一区二区| avav在线看| 日韩电影av| 色婷婷综合久久久中文一区二区| 国产又黄又大又粗视频| 理论不卡电影大全神| 亚洲一二三区在线观看| 欧美视频在线第一页| 手机电影在线观看| 一区二区久久久久久| 青青在线视频免费观看| 在线h片观看| 亚洲一二三区不卡| 国产精品裸体瑜伽视频| 9999精品成人免费毛片在线看| 亚洲午夜激情网站| 人妻夜夜添夜夜无码av| 国产伦子伦对白在线播放观看| 亚洲第一福利视频在线| jizzjizz国产精品喷水| 日本三级一区| 欧美性猛交xxxx黑人交| 亚洲一区二区三区四区五区| 懂色av色香蕉一区二区蜜桃| 精品国产一区二区三区av性色| 无码人妻一区二区三区免费n鬼沢| 国产精品115| 国产视频精品免费播放| 日韩一级av毛片| 国产精品久久久久久影院8一贰佰| 精品精品国产国产自在线| 欧美成人综合色| 国产日韩欧美三区| 国产精品视频免费在线观看| 国产毛片毛片毛片毛片| 成人综合婷婷国产精品久久蜜臀| 欧美另类网站| 日韩美女网站| 亚洲aaa精品| 成人性生生活性生交12| 国产精品毛片无码| 日韩成人中文字幕在线观看| 黄色一级a毛片| 久久久久美女| 色综合老司机第九色激情| 国产乡下妇女做爰视频| 久久久久久久波多野高潮日日| 国产精品高清免费在线观看| 国产精品久久免费| www.欧美.com| 亚洲欧美影院| 免费在线播放电影| 色综合 综合色| 亚洲精品免费一区亚洲精品免费精品一区| 日韩中文字幕视频网| 亚洲精品国产电影| 久久av在线| 日韩av网站大全| 91精品国自产在线| 欧美日韩亚洲一区| 国产精品福利片| 精品国产亚洲AV| 久久久精品人体av艺术| 手机看片日韩国产| 制服丝袜专区在线| 日韩视频123| 亚洲精品国产一区黑色丝袜| 欧美极品一区二区三区| 国产精品视频99| 亚洲人妻一区二区| 亚洲手机成人高清视频| aaa毛片在线观看| jizz久久精品永久免费| 中文字幕亚洲专区| 在线能看的av| 懂色av噜噜一区二区三区av| 亚洲图片欧洲图片日韩av| 免费h视频在线观看| 欧美一区二区视频网站| 亚洲国产日韩一区无码精品久久久| 好看的亚洲午夜视频在线| 国产在线久久久| 国产有码在线| 欧美日韩中文字幕在线| 97精品人人妻人人| 欧美日韩一区二区国产| 成人黄色大片在线免费观看| 国产美女视频一区二区三区 | 韩国欧美国产一区| 日韩成人在线资源| 午夜精品成人av| 亚洲精品电影在线| 日本网站在线播放| 成人丝袜18视频在线观看| 免费日韩在线观看| 国产高清日韩| 久久久极品av| 97超视频在线观看| 国产精品短视频| 国产又黄又猛的视频| 人人狠狠综合久久亚洲婷| 国产91色在线|| 国产青青草在线| 欧美亚洲精品一区| 国产传媒在线看| 另类人妖一区二区av| 亚洲狠狠婷婷综合久久久| 秋霞国产精品| 最新的欧美黄色| 亚洲无码精品在线播放| 国产精品国产三级国产a| 四季av一区二区| 日韩成人影院| 成人午夜一级二级三级| 国产秀色在线www免费观看| 欧美精品日韩精品| 曰本女人与公拘交酡| 国产精品18久久久久久vr| wwwwww欧美| 国产精品色呦| 欧美怡春院一区二区三区| 黄色av网站在线看| 欧美日韩欧美一区二区| 老熟妻内射精品一区| 国产传媒一区在线| 欧美亚洲国产成人| 国产在线日韩精品| 国产精品视频公开费视频| 顶级网黄在线播放| 亚洲的天堂在线中文字幕| 国产精品777777| 国产欧美一区二区精品性色超碰 | 国产成人无码一区二区三区在线 | 毛片aaaaaa| 久久电影国产免费久久电影| 中文精品无码中文字幕无码专区| silk一区二区三区精品视频| 91成人免费观看网站| 国产日韩精品在线看| 欧美一区二区三区四区五区| 久久久久久久久久久久国产| 久久久精品蜜桃| 欧美国产在线一区| 久久久久久久高潮| 强开小嫩苞一区二区三区网站| 国产精品对白| 国产精品久久久一区| 中文字幕伦理免费在线视频| 精品一区二区三区三区| 亚洲无码精品在线观看| 国产区精品区| 欧美乱熟臀69xxxxxx| 麻豆一区产品精品蜜桃的特点| 不卡的av电影| 日韩一区二区三区不卡视频| 中文字幕一区二区av| 九九九九久久久久| 日韩专区视频网站| 97超碰国产精品女人人人爽| av在线中文| 亚洲国产精品99久久| 夜夜骚av一区二区三区| 午夜激情久久久| 欧美日韩黄色网| 国产亚洲欧洲一区高清在线观看| 中文字幕无人区二| 九九热在线视频观看这里只有精品| 欧美一级欧美一级| 91精品国产乱码久久久久久| 久久精品日产第一区二区三区乱码 | 成人精品影院| 98国产高清一区| 天堂影院一区二区| 国产精品成人观看视频国产奇米| av在线影院| 亚洲视频一区二区三区| 亚洲精品国产精| 欧美亚洲日本国产| 日韩中文字幕在线观看视频| 一区二区三区欧美久久| 欧洲性xxxx| 2021国产精品久久精品| 欧美xxxxx少妇| 国产一区二区网址| 久久婷五月综合| 鲁大师影院一区二区三区| 国产www免费| 欧美日韩一区二区高清| 欧美爱爱视频网站| 日韩理论片av| 先锋影音欧美| 精品一区二区三区在线| 欧美日韩在线观看一区| 精品久久ai电影| 国产欧美日韩一区| 成人自拍在线| 国产精品一区二区欧美| 99re6热只有精品免费观看| 亚洲在线视频观看| 久久久久毛片免费观看| 成人午夜高潮视频| 久久天堂久久| av一区二区三区免费| jazzjazz国产精品麻豆| 国产一区二区三区四区五区在线| 国产96在线亚洲| 国产在线欧美日韩| 久久资源综合| 欧美不卡福利| 欧美日韩亚洲在线观看| 视频一区二区在线| 91亚洲一区| 日韩人妻一区二区三区蜜桃视频| 国产精品成人a在线观看| 一区二区冒白浆视频| 亚洲91中文字幕无线码三区| 黄色片免费在线观看视频| 亚洲福利精品| 日韩在线xxx| 日韩黄色在线观看| 国产无遮挡猛进猛出免费软件| 精品亚洲欧美一区| 亚洲性图第一页| 91亚洲精品乱码久久久久久蜜桃| 30一40一50老女人毛片| 久久香蕉国产线看观看99| 国产免费嫩草影院| 一区二区三区四区不卡在线| 日韩精品――中文字幕| 91久久精品一区二区三| 国产又黄又粗又长| 亚洲成人免费在线视频| 青青草av免费在线观看| www.日韩.com| av福利在线导航| 国产成人精品一区二区三区| 亚洲精品成a人ⅴ香蕉片| 国产精品白丝jk白祙| 国产欧美日韩精品一区二区三区| 国产又黄又爽免费视频| 99国产精品| 超碰成人在线播放| 99在线精品观看| 美国美女黄色片| 亚洲国产欧美在线| 中文字幕欧美在线观看| 欧美大片一区二区| 你懂的视频在线| 免费91在线视频| 亚洲最大网站| 91中文精品字幕在线视频| 日韩av中文字幕一区| 视频一区二区三区在线观看| 激情国产一区| 国产成人美女视频| 久久先锋影音av鲁色资源| 老熟妻内射精品一区| 色哟哟一区二区| 亚洲第一色网站| 视频直播国产精品| 免费毛片b在线观看| 成人激情视频在线观看| 国产精品最新| 国产在线精品91| 国产一区二区福利| 国产在线综合视频| 精品久久在线播放| 亚洲av无码一区二区乱子伦| 中文精品99久久国产香蕉| 美女av在线免费看| 国产精品swag| 你懂的国产精品永久在线| 亚洲老女人av| 国产三级精品三级在线专区| 日韩成人av毛片| 精品日韩欧美在线| 国产鲁鲁视频在线观看特色| 国产精品三级美女白浆呻吟| 亚洲免费成人av在线| 日本精品久久久久久久久久| 国产一区二区三区久久久| 一级黄色毛毛片| 91国模大尺度私拍在线视频| 在线观看xxx| 久久久久这里只有精品| 精品一区二区三区中文字幕| 伊人久久99| 日本不卡高清视频| 日韩影视一区二区三区| 91国产精品成人| 毛片网站在线| 日韩av电影手机在线| 一区二区导航| 成年人视频在线免费| 久久精品夜色噜噜亚洲a∨ | 亚洲国产美女搞黄色| 超碰免费在线97| 欧美乱大交xxxxx| 久久综合给合| 国产视频在线观看网站| 懂色av一区二区三区免费看| 免费中文字幕视频| 日韩三级高清在线| 精品精品导航| 国产免费一区二区| 亚洲另类自拍| 久久久久亚洲av无码专区桃色| 欧美午夜精品久久久久久人妖| 日韩亚洲视频在线观看| 人人爽久久涩噜噜噜网站| 亚洲春色h网| 亚洲 欧美 日韩系列| 综合分类小说区另类春色亚洲小说欧美 | 激情综合丁香五月| 欧美午夜精品在线| www.亚洲资源| 亚洲一区免费网站| 国产精品va| 波多野结衣 在线| 在线一区二区三区四区五区 | 97在线看免费观看视频在线观看| 婷婷国产精品| 国产一二三四在线视频| 中文字幕一区二区三区不卡| 99久久精品国产成人一区二区| 久久久久久久久久久免费 | 三年中国中文在线观看免费播放| 国产高清不卡一区| 国产成人免费看| www国产亚洲精品久久网站| 88久久精品| 国产黄色特级片| 中文字幕在线视频一区| 欧美一级做性受免费大片免费| 国产精品成人国产乱一区| 亚洲精品国产成人影院| 在线观看国产免费视频| 欧美视频在线不卡| 精精国产xxxx视频在线中文版| 欧洲精品一区色| 国产成都精品91一区二区三| 亚洲天堂一区在线观看| 久久精视频免费在线久久完整在线看| aaa国产精品| 无人在线观看的免费高清视频| 一区二区三区在线播放| 国外av在线| αv一区二区三区| 蜜桃av噜噜一区| 欧美亚韩一区二区三区| 久久精品色欧美aⅴ一区二区| 欧美尿孔扩张虐视频| 国产乱码一区二区三区四区| 日韩欧美国产成人| 18av在线播放| 婷婷精品国产一区二区三区日韩| 成人午夜激情在线|