菠蘿大象
用心思考,用心寫(xiě)作
首頁(yè)
新隨筆
聯(lián)系
管理
隨筆-67 評(píng)論-522 文章-0 trackbacks-0
學(xué)習(xí)JPA——Hibernate Annotation使用實(shí)例
目前,
JPA
(
Java Persistence API
)的使用范圍越來(lái)越廣,作為
Java EE 5.0
平臺(tái)標(biāo)準(zhǔn)的
ORM
規(guī)范,得到了諸如:
Hibernate
、
TopLink
、
OpenJpa
等
ORM
框架的支持,同時(shí)還是
EJB 3.0
的重要組成部分。
JPA
的宗旨是為
POJO
提供持久化標(biāo)準(zhǔn)規(guī)范。它能夠脫離容器獨(dú)立運(yùn)行,方便開(kāi)發(fā)和測(cè)試。本文將通過(guò)一個(gè)小實(shí)例來(lái)說(shuō)明如何在
Hibernate
中使用
JPA
,來(lái)達(dá)到簡(jiǎn)化編程的目的。
開(kāi)發(fā)環(huán)境
Eclipse 3.3.1 MyEclipse 6.0.1GA Tomcat 6.10
SQL Server 2000
hibernate-3.2.5.GA hibernate-annotations-3.3.0.GA
ejb3-persistence hibernate-commons-annotations-3.0.0.GA
本文是
讓大家了解一下相比與以前的
Hibernate ORM
映射的不同之處,以及采用
JPA
所帶來(lái)的好處。
為了保證程序能順序運(yùn)行,避免不同的
Eclipse
版本之間產(chǎn)生錯(cuò)誤,大象強(qiáng)烈建議,下載源碼后,按源碼中的工程名,自己?jiǎn)为?dú)新建同一個(gè)工程,再將
src
和
WEB-INF/lib
目錄下的所有文件
COPY
至對(duì)應(yīng)的目錄下。
1、創(chuàng)建
Web Project
點(diǎn)擊
"File"-
>
"New"
,選擇
"Web Project"
,在
"Project Name"
中輸入
ajax
,點(diǎn)擊
"Finish"
。下載本文后面需要用到的
JAR
包,加入到
WEB-INF/lib
目錄下,在
ajax
工程中,文本采用的是
UTF-8
編碼。
2、創(chuàng)建
HibernateSessionFactory
傳統(tǒng)的方法就是在工程名上點(diǎn)右鍵,選擇
”MyEclipse”
-
>”Add Hibernate Capabilities”
,然后就是按照提示一步一步做,不過(guò)在
MyEclipse
6.0.1
中添加
Hibernate
還是只能支持
3.1
,除非你選擇
” Add Spring Capabilities”
,里面才有
Hibernate 3.2
的類(lèi)庫(kù),要想完全兼容
JPA
,必須采用
3.2
以上版本。
這里大家直接使用源碼中的
HibernateSessionFactory
,注意請(qǐng)先建包:
com.ajax.core,
HibernateSessionFactory
中有一個(gè)地方需要改動(dòng),原來(lái)的寫(xiě)法是:
private
static
Configuration configuration
=
new
Configuration();
修改后為:
private
static
AnnotationConfiguration configuration
=
new
AnnotationConfiguration();
因?yàn)槲覀儾捎玫氖?/span>
JPA
注釋方式來(lái)映射實(shí)體,另外
AnnotationConfiguration
這個(gè)類(lèi)在
hibernate-annotations.jar
這個(gè)包中。
3、創(chuàng)建
BaseDao
在
com.ajax.core
包下面新建
BaseDao
抽象類(lèi),里面定義的是持久化操作方法,有一點(diǎn)特別要注意,一定要在增加、刪除、修改這幾個(gè)方法中加入事務(wù)控制,不管是在
BaseDao
基類(lèi)方法中加,還是在業(yè)務(wù)方法中加,一定要加事務(wù)控制,大象覺(jué)得在基類(lèi)中加會(huì)比較好一點(diǎn),這樣做代碼顯得更少更簡(jiǎn)潔。如果不加事務(wù)控制,那么增、刪、改這些操作都不會(huì)產(chǎn)生效果,因?yàn)槟J(rèn)情況下,它不會(huì)進(jìn)行自動(dòng)提交。在做這個(gè)例子的時(shí)候,這個(gè)問(wèn)題曾經(jīng)困擾了我好長(zhǎng)時(shí)間。因此,請(qǐng)大家記住不要再犯和大象一樣的錯(cuò)誤!貼出部分代碼,詳情請(qǐng)看源碼,里面有很全面的注釋。
/**
* 抽象Dao類(lèi),用于持久化操作
* @author 菠蘿大象
* @version 1.0
*/
public
abstract
class
BaseDao
<
T
>
{
private
static
Log log
=
LogFactory.getLog(BaseDao.
class
);
/**
* 獲取Hibernate的Session對(duì)象
*/
public
Session getSession(){
return
HibernateSessionFactory.getSession();
}
/**
* 根據(jù)主鍵得到對(duì)象
*/
public
T getObject(Class clazz, Serializable id){
return
(T)getSession().get(clazz, id);
}
/**
* 保存對(duì)象
*/
public
void
saveObject(T t) {
Session session
=
getSession();
Transaction tx
=
beginTransaction(session);
try
{
session.saveOrUpdate(t);
tx.commit();
}
catch
(Exception e){
tx.rollback();
log.error(
"保存對(duì)象失敗"
);
}
}
/**
* 創(chuàng)建事務(wù)
*/
private
Transaction beginTransaction(Session session){
return
session.beginTransaction();
}
}
4、創(chuàng)建
Employee
在
com.ajax.employee.mode
包下新建
Employee
類(lèi),這個(gè)就是
POJO
類(lèi),下面來(lái)詳細(xì)說(shuō)明里面的含義。
@Entity
@Table
(name
=
"EMPLOYEE"
)
public
class
Employee
implements
java.io.Serializable{
private
Integer employee_id;
//
人員ID(主鍵)
private
String employee_name;
//
人員姓名
private
String sex;
//
性別
private
String birthday;
//
出生日期
private
String address;
//
地址
@Id
@Column
(name
=
"EMPLOYEE_ID"
)
@TableGenerator
(
name
=
"tab-store"
,
table
=
"GENERATOR_TABLE"
,
pkColumnName
=
"G_KEY"
,
pkColumnValue
=
"EMPLOYEE_PK"
,
valueColumnName
=
"G_VALUE"
,
allocationSize
=
1
)
@GeneratedValue
(strategy
=
GenerationType.
TABLE
,generator
=
"tab-store"
)
public
Integer getEmployee_id() {
return
employee_id;
}
public
void
setEmployee_id(Integer employee_id) {
this
.employee_id
=
employee_id;
}
}
其它幾個(gè)屬性的
getter
和
setter
省略,這里我們要用到
ejb3-persistence.jar,JPA的注解類(lèi)就在這個(gè)包中,下面詳細(xì)說(shuō)明上面使用到的注解。
@Entity
:
通過(guò)
@Entity
注解將一個(gè)類(lèi)聲明為一個(gè)實(shí)體
bean
@Table
:
通過(guò)
@Table
注解可以為實(shí)體
bean
映射指定表,
name
屬性表示實(shí)體所對(duì)應(yīng)表的名稱(chēng)
,如果沒(méi)有定義
@Table
,那么系統(tǒng)自動(dòng)使用默認(rèn)值:實(shí)體的類(lèi)名(不帶包名)
@Id
:
用于標(biāo)記屬性的主鍵
@Column
:
表示持久化屬性所映射表中的字段,如果屬性名與表中的字段名相同,則可以省略
@Column
注解,另外有兩種方式標(biāo)記,一是放在屬性前,另一種是放在
getter
方法前,例如:
@Column(name
=
"
EMPLOYEE_NAME
"
)
private
String employee_name;
或者
@Column(name
=
"
EMPLOYEE_NAME
"
)
public
String getEmployee_name() {
return
employee_name;
}
這兩種方式都是正解的,根據(jù)個(gè)人喜好來(lái)選擇。大象偏向于第二種,并且喜歡將屬性名與字段名設(shè)成一樣的,這樣可以省掉
@Column
注解,使代碼更簡(jiǎn)潔。
@TableGenerator
:
表生成器,
將當(dāng)前主鍵的值單獨(dú)保存到一個(gè)數(shù)據(jù)庫(kù)表中,主鍵的值每次都是從指定的表中查詢來(lái)獲得,這種生成主鍵的方式是很常用的。這種方法生成主鍵的策略可以適用于任何數(shù)據(jù)庫(kù),不必?fù)?dān)心不同數(shù)據(jù)庫(kù)不兼容造成的問(wèn)題。大象推薦這種方式管理主鍵,很方便,集中式管理表的主鍵,而且更換數(shù)據(jù)庫(kù)不會(huì)造成很大的問(wèn)題。各屬性含義如下:
name
:
表示該表主鍵生成策略的名稱(chēng),這個(gè)名字可以自定義,它被引用在
@GeneratedValue
中設(shè)置的"
generator"
值中
table
:
表示表生成策略所持久化的表名,說(shuō)簡(jiǎn)單點(diǎn)就是一個(gè)管理其它表主鍵的表,本例中,這個(gè)表名為
GENERATOR_TABLE
pkColumnName
:
表生成器中的列名,用來(lái)存放其它表的主鍵鍵名,這個(gè)列名是與表中的字段對(duì)應(yīng)的
pkColumnValue
:
實(shí)體表所對(duì)應(yīng)到生成器表中的主鍵名,這個(gè)鍵名是可以自定義滴
valueColumnName
:
表生成器中的列名,實(shí)體表主鍵的下一個(gè)值,假設(shè)
EMPLOYEE
表中的
EMPLOYEE_ID
最大為
2
,那么此時(shí),生成器表中與實(shí)體表主鍵對(duì)應(yīng)的鍵名值則為
3
allocationSize
:
表示每次主鍵值增加的大小,例如設(shè)置成
1
,則表示每次創(chuàng)建新記錄后自動(dòng)加
1
,默認(rèn)為
50
@GeneratedValue
:
定義主鍵生成策略,這里因?yàn)槭褂玫氖?/span>
TableGenerator
,所以,主鍵的生成策略為
GenerationType.TABLE
,
生成主鍵策略的名稱(chēng)則為前面定義的
”
tab-store
”
。
這里大象想說(shuō)下,網(wǎng)上有很多文章寫(xiě)的是
strategy = GenerationType.AUTO
或是
strategy = GenerationType.
SEQUENCE
,采用
SEQUENCE
序列是因?yàn)?/span>
Oracle
數(shù)據(jù)中不支持
identity
自動(dòng)增長(zhǎng),要想使用它,還得在數(shù)據(jù)庫(kù)中創(chuàng)建一個(gè)序列,如果要更換數(shù)據(jù)庫(kù),那將是一個(gè)非常麻煩的事情。
SEQUENCE
生成方式我們暫且不談,這里說(shuō)下采用
AUTO
和
IDENTITY
的生成方式,本例采用的是
SQL Server 2000
作為數(shù)據(jù)庫(kù),所以如果想使用
AUTO
或是
IDENTITY
生成策略,則一定要對(duì)主鍵加上
identity
標(biāo)識(shí),如
identity(1,1)
。不過(guò)對(duì)于
AUTO
來(lái)說(shuō),是根據(jù)不同的數(shù)據(jù)庫(kù)選擇最合適的自增主鍵生成策略。如果使用
MySQL
,則主鍵要定義
AUTO_INCREMENT
,如果是
Oracle
,則要
創(chuàng)建
Sequence
來(lái)實(shí)現(xiàn)自增。不管采用何種生成策略,增、刪、改這些方法中一定要加入事務(wù),否則數(shù)據(jù)是不會(huì)添加到數(shù)據(jù)庫(kù)中滴~~~
這是大象反復(fù)測(cè)試過(guò)的結(jié)果!
5、
創(chuàng)建數(shù)據(jù)庫(kù)及表
接下來(lái),我們需要為本例創(chuàng)建一個(gè)數(shù)據(jù)庫(kù)及必要的表。數(shù)據(jù)庫(kù)名為
ajax
,表只有兩個(gè)
EMPLOYEE
和
GENERATOR_TABLE
,下面是
SQL
腳本:
CREATE
TABLE
EMPLOYEE(
EMPLOYEE_ID
int
not
null
,
EMPLOYEE_NAME
varchar
(
20
)
null
,
SEX
char
(
2
)
null
,
BIRTHDAY
varchar
(
10
)
null
,
ADDRESS
varchar
(
50
)
null
,
CONSTRAINT
PK_EMPLOYEE
PRIMARY
KEY
(EMPLOYEE_ID)
)
CREATE
TABLE
GENERATOR_TABLE(
ID
int
not
null
,
G_KEY
varchar
(
20
)
null
,
G_VALUE
int
null
,
CONSTRAINT
PK_GENERATOR_TABLE
PRIMARY
KEY
(ID)
)
INSERT
INTO
GENERATOR_TABLE
VALUES
(
1
,EMPLOYEE_PK,
1
)
如果你覺(jué)得麻煩,不想建庫(kù)及表,可以將后面的數(shù)據(jù)庫(kù)下載下來(lái),然后還原數(shù)據(jù)庫(kù)就可以了。
6、
修改
hibernate.cfg.xml
本例中,采用的是
JTDS
連接驅(qū)動(dòng),我們要對(duì)配置文件作一些設(shè)置,另外還要加入
POJO
類(lèi)。
<
property
name
="dialect"
>
org.hibernate.dialect.SQLServerDialect
</
property
>
<
property
name
="connection.driver_class"
>
net.sourceforge.jtds.jdbc.Driver
</
property
>
<
property
name
="connection.url"
>
jdbc:jtds:sqlserver://localhost:1433/ajax
</
property
>
<
property
name
="connection.username"
>
sa
</
property
>
<
property
name
="connection.password"
>
自己密碼(無(wú)密碼就空著)
</
property
>
<!--
實(shí)體類(lèi)
-->
<
mapping
class
="com.ajax.employee.model.Employee"
/>
以前沒(méi)有使用
JPA
注解的時(shí)候,我們這里加入的都是
hbm.xml
文件,現(xiàn)在我們則加入的是類(lèi)。
7、
創(chuàng)建
EmployeeManager
在
com.ajax.employee.service
下新建
EmployeeManager
類(lèi),這里面就是寫(xiě)業(yè)務(wù)方法,另外在這個(gè)類(lèi)中添加一個(gè)
main
方法用于測(cè)試,將
log4j
的日志級(jí)別調(diào)整為
DEBUG
,這樣我們就可以看到很詳細(xì)的程序運(yùn)行信息,源碼中的注釋很詳細(xì),這里就不貼出來(lái)了。
本例沒(méi)有提供
MySQL
和
Oracle
數(shù)據(jù)庫(kù)的腳本,不過(guò)這些應(yīng)該很簡(jiǎn)單,按照最基本的方式建一個(gè)數(shù)據(jù)庫(kù)和兩張表就行了,這里附上兩種數(shù)據(jù)庫(kù)的
hibernate
配置。
MySQL:
<
property
name
="hibernate.dialect"
>
org.hibernate.dialect.MySQLInnoDBDialect
</
property
>
<
property
name
="connection.driver_class"
>
com.mysql.jdbc.Driver
</
property
>
<
property
name
="connection.url"
>
jdbc:mysql://localhost:3306/ajax
</
property
>
<
property
name
="connection.username"
>
root
</
property
>
<
property
name
="connection.password"
>
自己的密碼(無(wú)密碼就空著)
</
property
>
Oracle:
<
property
name
="hibernate.dialect"
>
org.hibernate.dialect.OracleDialect
</
property
>
<
property
name
="connection.driver_class"
>
oracle.jdbc.driver.OracleDriver
</
property
>
<
property
name
="connection.url"
>
jdbc:oracle:thin:@127.0.0.1:1521:自己的SID
</
property
>
<
property
name
="connection.username"
>
system
</
property
>
<
property
name
="connection.password"
>
自己的密碼(無(wú)密碼就空著)
</
property
>
本文主要是從實(shí)用的角度來(lái)說(shuō)明如何在
Hibernate
中使用
JPA
注釋來(lái)簡(jiǎn)化開(kāi)發(fā)
。
從這里可以看出,我們不需要再編寫(xiě)繁瑣的
hbm.xml
文件。另外,
JPA
的功能很強(qiáng)大,這里只展示了其中的冰山一角,如果想深入學(xué)習(xí)
JPA
的話,請(qǐng)單獨(dú)查找資料或購(gòu)買(mǎi)相關(guān)書(shū)籍。
下面是本例中必須的JAR包
點(diǎn)擊下載:
antlr-2.7.6
asm-1.5.3
cglib-2.1.3
commons-collections-2.1.1
commons-lang-2.1
commons-logging-1.0.4
log4j-1.2.14
ehcache-1.2.3
ejb3-persistence-3.0
hibernate3-3.2.5
hibernate-annotations-3.3.0
hibernate-commons-annotations-3.0.0
mysql-connector
.jar
jtds.jar
classes12.jar
點(diǎn)擊下載:
ajax_project
db_ajax
本文為菠蘿大象原創(chuàng),如要轉(zhuǎn)載請(qǐng)注明出處。
posted on 2008-09-19 00:33
菠蘿大象
閱讀(30310)
評(píng)論(3)
編輯
收藏
所屬分類(lèi):
Hibernate
評(píng)論:
#
re: 學(xué)習(xí)JPA——Hibernate Annotation使用實(shí)例 2008-09-20 17:03 |
huangzhiwei
不錯(cuò)
學(xué)習(xí)了
謝謝
回復(fù)
更多評(píng)論
#
re: 學(xué)習(xí)JPA——Hibernate Annotation使用實(shí)例 2010-07-07 11:30 |
RoyPayne
e...
頭像還是原來(lái)的可愛(ài)。
哇哈哈~~
回復(fù)
更多評(píng)論
#
re: 學(xué)習(xí)JPA——Hibernate Annotation使用實(shí)例
2010-07-07 11:37 |
菠蘿大象
@RoyPayne
咳咳。。。這個(gè)是大象本人,我怕用那個(gè)喬巴頭像,少年周刊和尾田榮一郎找我索賠。
回復(fù)
更多評(píng)論
新用戶注冊(cè)
刷新評(píng)論列表
只有注冊(cè)用戶
登錄
后才能發(fā)表評(píng)論。
網(wǎng)站導(dǎo)航:
博客園
IT新聞
Chat2DB
C++博客
博問(wèn)
管理
相關(guān)文章:
學(xué)習(xí)JPA——Hibernate Annotation使用實(shí)例
小談Hibernate中的HQL與QBC查詢
<
2010年7月
>
日
一
二
三
四
五
六
27
28
29
30
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
1
2
3
4
5
6
7
隨筆分類(lèi)
(67)
Concurrency(3)
Database(4)
dom4j&jdom(3)
Eclipse(3)
Flex(4)
Hibernate(2)
Java(11)
jBPM(1)
jQuery(5)
Linux(1)
mybatis-generator(3)
Spring3(11)
Struts2(9)
隨筆(7)
隨筆檔案
(67)
2015年9月 (1)
2015年8月 (1)
2015年7月 (1)
2015年5月 (1)
2015年4月 (1)
2015年3月 (3)
2015年2月 (1)
2015年1月 (2)
2014年8月 (1)
2014年6月 (2)
2014年5月 (2)
2014年4月 (3)
2014年3月 (1)
2014年2月 (1)
2014年1月 (2)
2013年12月 (3)
2013年11月 (2)
2013年10月 (2)
2013年9月 (2)
2012年5月 (1)
2012年4月 (2)
2011年8月 (1)
2011年6月 (1)
2011年5月 (3)
2010年9月 (1)
2010年8月 (1)
2010年7月 (1)
2010年6月 (1)
2010年5月 (2)
2010年4月 (4)
2010年3月 (2)
2010年2月 (7)
2008年9月 (2)
2008年8月 (6)
搜索
積分與排名
積分 - 781050
排名 - 54
最新隨筆
1.?由Struts2Action代理和googlecode-jsonplugin產(chǎn)生的一個(gè)IllegalArgumentException異常問(wèn)題
2.?在CentOS系統(tǒng)中同步時(shí)間
3.?全局唯一ID生成器淺析
4.?用Java實(shí)現(xiàn)MJD轉(zhuǎn)UTC
5.?修改mybatis-generator-1.3.2源碼實(shí)現(xiàn)自定義代碼生成詳解(三)
6.?修改mybatis-generator-1.3.2源碼實(shí)現(xiàn)自定義代碼生成詳解(二)
7.?修改mybatis-generator-1.3.2源碼實(shí)現(xiàn)自定義代碼生成詳解(一)
8.?Quartz Spring與Spring Task總結(jié)
9.?常用的MySQL復(fù)雜查詢語(yǔ)句寫(xiě)法
10.?常用的MySQL語(yǔ)句寫(xiě)法
11.?淺談Java兩種并發(fā)類(lèi)型——計(jì)算密集型與IO密集型
12.?使用XStream注解實(shí)現(xiàn)Java對(duì)象與XML互相轉(zhuǎn)換的代碼示例
13.?淺談volatile變量的理解
14.?淺談Java共享變量
15.?m2eclipse安裝小貼士
最新評(píng)論
1.?re: 修改mybatis-generator-1.3.2源碼實(shí)現(xiàn)自定義代碼生成詳解(一)
評(píng)論內(nèi)容較長(zhǎng),點(diǎn)擊標(biāo)題查看
--半湖思絮
2.?re: 修改mybatis-generator-1.3.2源碼實(shí)現(xiàn)自定義代碼生成詳解(一)
評(píng)論內(nèi)容較長(zhǎng),點(diǎn)擊標(biāo)題查看
--菠蘿大象
3.?re: 修改mybatis-generator-1.3.2源碼實(shí)現(xiàn)自定義代碼生成詳解(一)
評(píng)論內(nèi)容較長(zhǎng),點(diǎn)擊標(biāo)題查看
--donghc
4.?re: 修改mybatis-generator-1.3.2源碼實(shí)現(xiàn)自定義代碼生成詳解(一)
@donghc
maven不是這樣玩的呀,我的run是打包后用的,你仔細(xì)看了第三篇的內(nèi)容么?在IDE里直接啟動(dòng)StartUp就行了,這個(gè)類(lèi)是用來(lái)測(cè)試的
--菠蘿大象
5.?re: 修改mybatis-generator-1.3.2源碼實(shí)現(xiàn)自定義代碼生成詳解(一)
評(píng)論內(nèi)容較長(zhǎng),點(diǎn)擊標(biāo)題查看
--donghc
閱讀排行榜
1.?使用jackson對(duì)Java對(duì)象與JSON字符串相互轉(zhuǎn)換的一些總結(jié)(59338)
2.?在Eclipse中反編譯Class文件完全詳解(43602)
3.?Quartz Spring與Spring Task總結(jié)(38578)
4.?使用XStream注解實(shí)現(xiàn)Java對(duì)象與XML互相轉(zhuǎn)換的代碼示例(33141)
5.?Spring MVC 3.0.5+Spring 3.0.5+MyBatis3.0.4全注解實(shí)例詳解(二)(32458)
評(píng)論排行榜
1.?Struts2.1.6+Spring2.5.6+Hibernate3.3.1全注解實(shí)例詳解(五)(69)
2.?Struts2.1.6+Spring2.5.6+Hibernate3.3.1全注解實(shí)例詳解(三)(47)
3.?Struts2.1.6+Spring2.5.6+Hibernate3.3.1全注解實(shí)例詳解(一)(35)
4.?Struts2.1.6+Spring2.5.6+Hibernate3.3.1全注解實(shí)例詳解(二)(27)
5.?Spring MVC 3.0.5+Spring 3.0.5+MyBatis3.0.4全注解實(shí)例詳解(三)(26)
Powered by:
博客園
模板提供:
滬江博客
Copyright ©2025 菠蘿大象
主站蜘蛛池模板:
久久www免费人成看片
|
免费人成在线观看网站视频
|
国产一级一片免费播放
|
国产亚洲美女精品久久久
|
亚洲视频在线观看免费视频
|
美女18毛片免费视频
|
在线观看免费中文视频
|
国产一区二区三区免费视频
|
亚洲好看的理论片电影
|
国产亚洲精品第一综合
|
免费无码成人AV在线播放不卡
|
国产大片91精品免费观看男同
|
亚洲视频在线播放
|
黄页网站在线免费观看
|
欧洲乱码伦视频免费
|
中文亚洲AV片在线观看不卡
|
亚洲Av高清一区二区三区
|
a级在线免费观看
|
高清国语自产拍免费视频国产
|
国产aⅴ无码专区亚洲av
|
亚洲爆乳成av人在线视菜奈实
|
免费一级不卡毛片
|
日本中文一区二区三区亚洲
|
亚洲国产品综合人成综合网站
|
香蕉免费看一区二区三区
|
免费无码又爽又刺激毛片
|
亚洲成色999久久网站
|
青青草国产免费国产是公开
|
国产麻豆视频免费观看
|
亚洲AV无码久久精品蜜桃
|
美女免费视频一区二区
|
成年人在线免费观看
|
久久精品亚洲精品国产色婷
|
乱人伦中文视频在线观看免费
|
国产日本一线在线观看免费
|
亚洲AV一宅男色影视
|
一边摸一边爽一边叫床免费视频
|
美女内射毛片在线看免费人动物
|
亚洲不卡无码av中文字幕
|
亚洲人成网国产最新在线
|
最近的中文字幕大全免费8
|