??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲美女视频一区,国产性爱在线观看亚洲黄色一级片,亚洲av永久无码嘿嘿嘿http://www.tkk7.com/human2008/category/28759.htmlzh-cnFri, 11 Jan 2008 13:22:56 GMTFri, 11 Jan 2008 13:22:56 GMT60Java Q- 在Eclipse上用Hibernate http://www.tkk7.com/human2008/archive/2008/01/11/174496.html??Fri, 11 Jan 2008 01:34:00 GMThttp://www.tkk7.com/human2008/archive/2008/01/11/174496.htmlhttp://www.tkk7.com/human2008/comments/174496.htmlhttp://www.tkk7.com/human2008/archive/2008/01/11/174496.html#Feedback0http://www.tkk7.com/human2008/comments/commentRss/174496.htmlhttp://www.tkk7.com/human2008/services/trackbacks/174496.html
 Q?Q下载HibernateQƈ向项目中导入Hibernate?br />      Project->Properies->Java Build Path->Libraries->Add External JARs...Q选择Hibernate根目录下的hibernate3.jarQ添加到目中?br />     接着Q要Hibernate下的lib文g夹下的所有文仉作ؓ一个User Libraryd到项目中Q否则,如果仅仅dhibernate3.jarQ编译可以通过Q运行却会抛出ClassNotDef的异常,因ؓhibernate3.jar依赖于Hibernate下的lib文g夹下的文件?br />
 2Q我们的应用的后台数据库使用的是OracleQ所以首先要在例子项目中引入含有Oracle jdbc driver的包Qclasses12.jar。该jar文g位于oracle安装目录的jdbc\lib目录下?br />     在Eclipse中,Project->Properies->Java Build Path->Libraries->Add External JARs...Q选择classes12.jarQ将其添加到目中?br />     
Q?Q生成hibernate.cfg.xml文g?br />     通常Hibernate的配|文件和.hbm.xml文g都可以自动生成,q种自动生成的工具很多,我用的是HibernateSynchronizerQ它可以作ؓ一个插件添加到Eclipse中。当HibernateSynchronizer插g正确加蝲后,我们可以向当前项目中dHibernate配置文gQFile->New->Other->Hibernate->Hibernate Configuration FileQ出现如下界面:


  注意QDriver Class要选择针对Oracle的oracle.jdbc.driver.OracleDriverQ而且Database URL的格式也要正,如:
jdbc:oracle:thin:@10.8.8.221:1521:ORCL

    最好将hibernate.cfg.xml文g存放于项目的根目录下?br />
 4Q生?hbm.xml文g。File->New->Other->Hibernate->Hibernate Mapping FileQ出现如下界面:

     
    在填写完Password后,点击Refresh按钮Q就会在Tables中列出所有可以访问的数据库表Q然后选中要ؓ其生?hbm.xml文g的表Q点击FinishQ即会生成对应的.hbm.xml文gQ比如我上面选择的是Mobileuser表,׃生成Mobileuser.hbm.xml文g?br />
Q?Q从.hbm.xml文g自动生成实体cR?br />     在Package Explorer中选中Mobileuser.hbm.xml文gQ右?>Hibernate Synchronizer->Synchronize Files Q即可生成对应的实体cdDAOcR如果你仅仅惌实体c,那么可以在Project->Properies->Hibernate Synchronizer->Data Access Objects Q将“I would like to have DAOs created for me”的钩选项L卛_?br />
Q?Q在hibernate.cfg.xml文g中添加对应的mapping resource?br />     在Package Explorer中选中Mobileuser.hbm.xml文gQ右?>Hibernate Synchronizer->Add Mapping ReferenceQ即会在
hibernate.cfg.xml中自动生成如下配|:

<mapping resource="HibernateTest/Mobileuser.hbm.xml" />

Q?Q修改自动生成的hibernate.cfg.xml文g。需要在hibernate.cfg.xml文g的首部添加:

<!DOCTYPE hibernate-configuration PUBLIC
        
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
        
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">

    比较J琐的是Q每ơ自动修改hibernate.cfg.xml文g后,都要重新dq个xml片断?br />
    万事具备Q现在可以写个测试来验一下了Q?/p>

    //仅仅作ؓCZQ没有进行异常处?/span>
    public static void main(String[] args)
    {
        Configuration cfg 
= new Configuration().configure() ;        
        SessionFactory  sFactory 
= cfg.buildSessionFactory() ;        
        
        Session session 
= sFactory.openSession() ;
        Transaction tx 
= session.beginTransaction();
        Mobileuser user 
= (Mobileuser)session.load(Mobileuser.class , new Integer(2)) ;
        String age 
= user.getMobilenumber() ;
        
        System.
out.println(age) ;
        tx.commit();
        session.close() ;
    }


? 2008-01-11 09:34 发表评论
]]>
Hibernate 3新增XML关系持久性介l(转) http://www.tkk7.com/human2008/archive/2008/01/10/174227.html??Thu, 10 Jan 2008 03:41:00 GMThttp://www.tkk7.com/human2008/archive/2008/01/10/174227.htmlhttp://www.tkk7.com/human2008/comments/174227.htmlhttp://www.tkk7.com/human2008/archive/2008/01/10/174227.html#Feedback0http://www.tkk7.com/human2008/comments/commentRss/174227.htmlhttp://www.tkk7.com/human2008/services/trackbacks/174227.html  Hibernate的易用性、高性能和对象关pL久性等高Ҏ给IT界带来了很大的惊喜?!--newszw_hzh_begin--> Hibernate的最新版?版本3Q??9日发布的)l品API带来了一个重要的新特性:XML持久性。有了Hibernate 3之后QJava应用E序开发者可以轻易地把XML文档合ƈ到关pd数据库中?/p>

  q个新特性应该明地告诉已有的Hibernate开发者,因ؓ它也遵@POJO(U的旧Java对象)相同的一致性方法,需要学习的知识最。XML持久性的优点也应该介l给新用戗本文讲解的是Hibernate 3持久性方法?

  XML持久性ؓ什么重?/strong>

  大多数大型商业数据库都支持某UŞ式的本地XML持久性。由于XML持久性是一个相对较新的机制--即对大型厂商也是如此,q个领域中的标准q在不断地Q现。其l果是,Z把无处不在的关系型持久性机制与日益增长的XML解决Ҏ集成在一P架构师必M赖厂商特定的Ҏ或者实现定制的XML持久性框架组件。这两个选择都没有太大的吸引力。厂商特定的Ҏ不是普及的Q因为可能生厂商封?lock-in)Q而定制的框架lg实现可能耗费大量的时间和财力Q导致代码难于维护?/p>

  在OR(对象关系)持久性方面,Hibernate XML持久性是一个自然而然的解x案。它可以跨越Hibernate支持的所有关pdq_(如虚拟的或真实的关系型^?U?!-- -->动,允许自由的迁Ud象、基于XML的应用程序和集成解决Ҏ而不用担心下层的关系型实现方法?/p>

  体系l构的细节信?/strong>

  Hibernate是一个良好架构的框架lgQ它无缝地利用了本地的环境,不需要用戯行Q何特D的q涉或安装操作。从一个数据库切换到另外一个数据库通常只需要改变驱动程序,q|Hibernate(在线配置讄信息)来用另外一U数据库语言?/p>

  Hibernate利用dom4j框架lgq行XML的分析和l护。如果需要完全利用Hibernate的XMLҎ,你就必须对dom4j非常熟悉。一般来_你会发现dom4j比Java提供的JAXP或与JAXP兼容的XML分析器要Ҏ使用一些。它要求我们学习的相关知识较,q且利用最的dom4j知识你就能够高效率地使用Hibernate XML持久性?

实际例子Qh格目录同?br />
  通用的电子商务案例可以演CXML关系持久性机制的作用。我们来考虑一个示例,在这个例子中XML集成了在UK售商和供应商之间的品标L录?br />
  该电子目录包含了已标L产品列表。在U商店销售品,通过自己的存货清单来理Q类gAmazon与Toys-R-Us和运动品商店之间的关系Q。ؓ了精地和有效地反映h的变化,在线零售商必频J地接收产品h信息。它把这些信息存放ؓXML文档Q如下所C:

QproductsQ?br /> Qproduct prod_id="3" sku="100101"Q?
QdescriptionQAthlete mode body fat scaleQ?descriptionQ?br /> Qlist_priceQ?00.00Q?list_priceQ?br /> Qdrop_priceQ?0.00Q?drop_priceQ?br /> Q?productQ?
Qproduct prod_id="4" sku="100102"Q?br /> QdescriptionQThermometerQ?descriptionQ?br /> Qlist_priceQ?0.00Q?list_priceQ?br /> Qdrop_priceQ?1.00Q?drop_priceQ?br /> Q?productQ?br /> Q?productsQ?/td>

  全面的主要的产品h列表存储在数据库中,如下所C:

CREATE TABLE PRODUCT
(
id INT UNIQUE NOT NULL,
description VARCHAR(45) NOT NULL,
sku VARCHAR(45) UNIQUE NOT NULL,
list_price FLOAT,
base_price FLOAT,
order_price FLOAT,
CONSTRAINT PK_PRODUCT PRIMARY KEY (id )
)

  在线零售商通过已有的OR映射提供定h目录的Web表现形式Q定价品都表现为demo.Product Java对象Q?br />
/** Product对象表现了定L录项*/
public class Product {
int id;
String sku;
String description;
Double listPrice;
Double basePrice;
Double orderPrice;

  q些对象按照下面的方式映(Z清楚Q我们列Z列名Q尽在属性和列名相匹配的时候Hibernate可以自动地把属性映ؓ列名Q:

Q?xml version="1.0"?Q?br /> Q?DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"Q?br /> Qhibernate-mapping package="demo"Q?br /> Qclass name="Product"
table="product"
node="product"Q?br /> Qid name="id"
type="int"
node="@prod_id"
column="id"Q?br /> Q?idQ?br /> Qproperty name="sku" node="@sku" column="sku" not-null="true"/Q?br /> Qproperty name="description" node="description" column="description" not-null="true"/Q?
Qproperty name="listPrice" node="list_price" column="list_price" /Q?br /> Qproperty name="basePrice" node="drop_price" column="base_price"/Q?br /> Qproperty name="orderPrice" column="order_price"/Q?br /> Q?classQ?br /> Q?hibernate-mappingQ?/td>

  在这U情况下QHibernate的XML关系持久性就非常方便了。由于该电子商务应用E序接收了包含品h格更新的XMLQ它利用Hibernate的XML持久性机制把q些XML写入C品数据库中。Hibernate提供了几UXML持久性选择Q包括Hibernate的saveOrUpdateҎQ?br />
document = saxReader.read(inputXML);
List users = document.selectNodes("http://product");
try {
 Session session = ibernateUtil.sessionFactory.openSession();
 Transaction transaction = session.beginTransaction();
 Session dom4jSession = session.openSession(EntityMode.DOM4J);
 Iterator iter = users.iterator();
 while (iter.hasNext()) {
  Object next = iter.next();
  dom4jSession.saveOrUpdate("demo.Product", next );
 }// end while
transaction.commit();
session.close(); 

  XML映射语法

  上面的例子中使用的映文件不用于Hibernate 2的映文件。Hibernate 3引入了几U专门用于XML持久性的新映类型?br />
  主要的新映射属性是节点QnodeQ,它与被映的XML文档中的一个元素或文档中的属性相兌?br />
  一?节点"可能表现Z面的某种映射Q?br />
  · "element-nameQ元素名Q?Q在例子中,QproductQ</productQ元素会被表CZؓnode="product"?br />
  · "@attribute-nameQ属性名Q?Q在例子中,node="@sku"会被映射为XML属性<product sku="1001001"Q?br />
  · ".Q句点)"Q映ؓ元素的父元素Q例如<productsQ就QproductQ是的父元素Q?br />
  · "element-name/@attribute-nameQ元素名/属性名Q?Q映ؓ命名元素的属性(product/@skuQ?br />
  XML持久性ƈ非Hibernate的主要Q?/strong>

  Hibernate 3框架lg高效率地实现了目前最通用的一些方法(除了LDAP之外Q。JavaC֛现在拥有了一套框架组Ӟ它ؓ易于实现的OR和XML持久性提供了高效率的和一致性的Ҏ?br />
  在我们知道上面一些内容之后,了解Hibernate目的Q务是很重要的。尽Hibernate 3的XMLҎ非常有用、有吸引力,但是它们q不是用来代替最行的XML~组QmarshallingQ和转换QtransformationQ框架组件的。不它的OR映射解决Ҏ多么完善Q我们都不应该期待Hibernate成ؓL的XMLl护框架lgQ根据Hibernate的作者Gavin King在TheServerSide Java Symposium 2005上的发言Q?br />
  ׃q个原因Q你应该把XML持久性特性看作是已有的强大的Hibernate框架lg的有用的扩展Q它允许你轻易地把现在流行的其它的数据表现机制合q到自己的应用程序中。但是,如果你必d理复杂的集成和{换情况,最好去L其它的XML专用的框架组件?!--newszw_hzh_end-->

? 2008-01-10 11:41 发表评论
]]>
hibernate入门 http://www.tkk7.com/human2008/archive/2008/01/10/174226.html??Thu, 10 Jan 2008 03:40:00 GMThttp://www.tkk7.com/human2008/archive/2008/01/10/174226.htmlhttp://www.tkk7.com/human2008/comments/174226.htmlhttp://www.tkk7.com/human2008/archive/2008/01/10/174226.html#Feedback0http://www.tkk7.com/human2008/comments/commentRss/174226.htmlhttp://www.tkk7.com/human2008/services/trackbacks/174226.html一、首先学习hibernate.cfg.xml配置文g的具体配|?br /> <?xml version="1.0" encoding="UTF-8"?>
<!--指定该文件的官方dtd-->
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd" >
<hibernate-configuration>
  <session-factory>
    <!-- 昄sql语言 -->
    <property name="show_sql">true</property>
    <!-- sql语言 -->
    <property name="dialect">org.hibernate.dialect.MySQLDialect</property>
    <!-- jdbc驱动E式 -->
    <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
    <!-- jdbc url -->
    <property name="connection.url">jdbc:mysql://localhost:3306/test</property>
    <!-- 数据库用户名 -->
    <property name="connection.username">root</property>
    <!-- 数据库密?-->
    <property name="connection.password">wyq</property>
    <!-- C3P0q接池设?-->
    <!--最连接数-->
    <property name="c3p0.min_size">5</property>
    <!--最大连接数-->
    <property name="c3p0.max_size">20</property>
   <!--延迟所允许的时?->
    <property name="c3p0.timeout">1800</property>
   <!--~存所允许的最大连接数-->
    <property name="c3p0.max_statements">50</property>
    <!-- 每隔100W资料送入资料库,清除~存Q定期清除缓存,减小压力Q?-->
    <property name="hibernate.jdbc.batch_size">100</property>
    <!-- 讑֮事务理的工厂类 -->
    <property name="hibernate.transaction.factiory_class">org.hibernate.transaction.JDBCTransactionFactory</property>
   <mapping resource="com/wyq/hibernate/pojo/User.hbm.xml"/>
   <mapping resource="com/wyq/hibernate/pojo/TUser.hbm.xml"/>
   <mapping resource="com/wyq/hibernate/pojo/Room.hbm.xml"/>
  </session-factory>
</hibernate-configuration>
需要的jar包有c3p0.jar,hibernate3.jar,数据?jar,log4j.jar


------------------------------------------------------------------------------------------------------------------------

1、读取配|文件获得连?br />    dhibernate.cfg.xml配置文gQhibernate.cfg.xml文g攑֜Classpath下,使用下面的方式读入该文g
      //Configuration 负责理hibernate配置信息
      Configuration config=new Configuration().configure();
      //Ҏconfig建立SessionFactory
      //SessionFactory用于建立Session
      SessionFactory sessionFactory=config.buildSessionFactory();
      //开启session,相当于jdbc的Connection
      session = sessionFactory.openSession();

2、Criteria 基本资料查询
(1)标准查询:
      //创徏查询标准
      Criteria criteria=session.creteCriteria(User.class);
      //查询条g
      criteria.add(Expression.eq("name","caterpillar"));
************************************************************************************
Expression.eq(String s1,String s2)---------->相等s1=s2
Expression.allEq(Map map)    --------------->多个属?值对应关p,多个Expression.eq叠加
Expression.gt(String s1,String s2)----------->大于s1>s2
Expression.ge(String s1,String s2)----------->大于{于s1>=s2
Expression.lt(String s1,String s2)------------>于s1<s2
Expression.le(String s1,String s2)------------>于{于s1<=s2
Expression.between(String s1,int s2,int s3)--->s2<s1<s3
Expression.like(String s1,String s2)------------>s1 like s2
比较2个属?br /> Expression.eqProperty(String s1,String s2)--->s1=s2
Expression.gtProperty(String s1,String s2)---->s1>s2
Expression.geProperty(String s1,String s2)---->s1>=s2
Expression.ltProperty(String s1,String s2)----->s1<s2
Expression.leProperty(String s1,String s2)----->s1<=s2
Expression.and()----->Expression.and(Expression.eq("String s1,String s2"),Expression.eq(String s3,String s4))
Expression.or()
************************************************************************************
(2)高查询
一、可以用Criteriaq行查询Qƈ用order对结果进行排序?br /> //讄从第几条开始取的记?br /> criteria.setFirstResult(100);
//最多取的几条记?br /> criteria.setMaxResults(20);
//对结果进行排?br /> criteria.addOrder(Order.asc(String s1));
criteria.addOrder(Order.desc(String s2));

二、可以对查询l果q行l计操作Q用Projections的rowCount(),count(),max(),min(),countDistinct(){方法:
例如Qcriteria.setProjection(Projections.max("age"));

三、还可以用Projections的groupProperty()来对l果q行分组
例如Qcriteria.setProjection(Projections.groupProperty("age"));

(***)四、结合统计与分组的功能,可以用ProjectionList
例如QProjectionList projectionList =Projections.projectionList();
            projectionList.add(Projections.groupProperty("age"));
            projectionList.add(Projections.rowCount());
            criteria.setProjection(projectionList);
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
      //查询所有记?br />       List users=criteria.list();
      Iterator iterator=users.iterator();
      while(iterator.hasNext()){
         User user=(User)iterator.next();
         System.out.println(user.getId()+"\t"+user.getName()+"/"+user.getAge());
}
3、criteria的增、删、改Q还不完善)
在用到增、删、改Ӟ必须先声明事?br /> 增加Q?br />   Transaction tx = session.beginTransaction();//Transaction表示一l会话操?br />   session.save(user);//事物映到数据库进行存?br />   tx.commit();
  session.close();
删除Q?br />   Session session=this.getSession();
  User user=(User)session.get(User.class, new Integer(1));
  Transaction tx = session.beginTransaction();//Transaction表示一l会话操?br />   session.delete(user);//事物映到数据库进行存?br />   tx.commit();
  session.close();

修改Q?br />   Session session=this.getSession();
  User user =(User)session.get(User.class,new Integer(2));//创徏持久化的事物
  user.setName("wyqqqqqqqqqq");
  user.setAge(new Integer(30));
  Transaction tx = session.beginTransaction();//Transaction表示一l会话操?br />
  session.update(user);//事物映到数据库进行存?br />   tx.commit();
  session.close();
----------------------------------------------------------------------------------------------------------------------
一、Query查询可以先设定查询参敎ͼ之后通过set{方法,指定的参数值添入.q可以用命名参?br /> Session session = sessionFactory.openSession();
Query query = session.createQuery("select user.name from User as user where user.age>?(
:minAge )");
query.setInteger(0,25);
query.setInteger("minAge",25);
List names=query.list();
Iterator iterator = names.iterator();
while(iterator.hasNext()){
      System.out.println(iterator.next());
}
session.close();

二、如果查询整个表直接使用from User如果针对某个属性?strong>select user.name from User as user
使用hql可以更接q我们^时的jdbc~程Q和把sql语句写在E序中差不多Q另外,也可以将sql语句写在配置文g中?/font>



--------------------------------------------------------------------------------------------------------------------------
   多表兌
一、多对一q行兌(多个学生对应同一间宿?---学生是主体,宿舍是附体,兌关系<many-to-one>在主体学生中讄Q在学生cM讄宿舍c,׃宿舍cd有一个可以直接用cL讄,在映学生类(User)中包含宿舍这个类(Room),在映配|文?User.hbm.xml)中定?br />
<many-to-one name="room" column="room_id" cascade="save-update" class="com.wyq.hibernate2.Room"></many-to-one>

哪个是主体类在哪个配置文g定义兌关系Q?br />
cascade属性:表示兌对象的持久化Q该属性也要设|在M中,作用是当主控方执行操作Ӟ兌对象(被动?是否同步执行同一操作Q?br /> cascade的|all:表示所有情况下都进行联操作.
                        none:所有情况下都不q行U联操作
                        save-update:在执行save-update时进行联操作.
                        delete:在执行delete时进行联操作.

注意Q用cascade自動持久化時Q會先檢查被關聯物g的id屬性,未被持久化的物g之id屬性是由unsaved-value決定Q預a是nullQ如果您使用long這樣的原生型態(primitive typeQ時Q則必須自行指定預設|

例如Q?lt;id name="id" column="ROOM_ID" unsaved-value="0">
            <generator class="increment"/>
        </id>

如果您不想額外設定unsaved-value資訊Q則可以long改為LongQ這可以符合預a的unsaved-value為null的設?nbsp;Q?br />
二、一对多q行兌(一间宿舍对应多个学?---宿舍是主体,学生是附体,兌关系<one-to-many>在主体宿舍中讄,׃要在宿舍cM讄学生c,一个宿舍包含多个学生,所以在宿舍cM要用SetcLq行讄Q用setc?private Set users = new HashSet();)来存储多个学生类Q在映射宿舍c?Room)中要包含<set>q个节点Q用来与user相关?br />
例如Q?lt;set name="users" table="USER">
            <key column="ROOM_ID"/>
            <one-to-many class="onlyfun.caterpillar.User"/>
        </set>

name:表示属性,table:表示兌的表名,key:表示通过什么字D进行关联,<one-to-many>:表示兌cR这里也可以使用cascade属性?br />
三、在表关联的设计中,不论是一对多q是多对一Q都要将兌字段讄在多的那一斏V?br /> 例如Quser表格和room表格Q要关联字Droom_id讄在user表格中?br />
四、一对一q行兌(一个h只有一个房_一个房间也只有一个h)?br /> 可以通过Q中方式q行兌Q?br />
(1)、通过外键q行兌Q在多对一的例子中是通过外键q行兌?
在user-room的设|中(user.hbm.xml):
<many-to-one name="room"
                     column="ROOM_ID"
                     class="onlyfun.caterpillar.Room"
                     cascade="all"
                     unique="true"/>

其中unique表示限制一個User有一獨有?RoomQ这只是单向的,说明一个user只有一个room.
在room-user的设|中(room.hbm.xml):
<one-to-one name="user"
                    class="onlyfun.caterpillar.User"
                    property-ref="room"/>
q样完成了双向的一对一兌Qproperty-ref告诉hibernate,查询出userq将其参考至room?br /> (2)、通过主键q行兌Q限制兩個資料表的主鍵用相同的|如此一個User與Room是一一關係
user.hbm.xml:
<one-to-one name="room"
                    class="onlyfun.caterpillar.Room"
                    cascade="all"/>
room.hbm.xml:
<one-to-one name="user"
                    class="onlyfun.caterpillar.User"
                    constrained="true"/>

使用constrained="true"告訴Hibernate參考至User的主?br />
五、双向关联,是一和二l合hQ?font color="#000000">如果關聯的E護交User的話會比較容易,因為每個User都對應至一個RoomQ在儲存時並用像Room一樣必須對Set中的每個物件作檢查Q為了將關聯的維護交iUserQ我們可以在Room.hbm.xml中的<set>修改Q加上inverse="true"Q表C將關聯的維譗反過來」交iUser?/span>


 例如Q?lt;set name="users" table="users" iinverse="true" cascade="all">
              <key  column="room_id"/>
              <one-to-many class="onlyfun.caterpillar.User"/>

在設立雙向關聯時Q關聯由多對一中「多」的哪一方維P會比由「一」的哪一方維護來的方便,在Hibernate可以藉由inverse來設定,不設定inverse基本上也可以運行Q但是效能會較差?/font>


------------------------------------------------------------------------------------------------------------------------
      在Hibernate中,集合的映射可以廉初始QLazy InitializationQ,在多对一或者一对多中,都可以用g遲初始,例如Q一个用?user对应user?有多个email地址(address对应address?Q也是在真正烦取該物g的資料時Q才向資料n查詢Q就上次例子來說Q就是我們在讀取User時,先不取得其中?addrs屬性中之物件資料,由於只需要讀取User的name屬性,此時我們只要執行一ơselect卛_Q真正需要addrs的資料時Q才向資料n要求。在含有集合cȝuser.hbm.xml中要如下讄Q?br />
  <set name="addrs" table="ADDRS" lazy="true">
            <key column="USER_ID"/>
            <element type="string" column="ADDRESS" not-null="true"/>
        </set>

--------------------------------------------------------------------------------------------------------------------------
      session是hibernateq做的核心,是有SessionFactory所创徏QsessionFactory是线E安全的Q你可以让多个线E同时存取SessionFactory,而不会有资源q的问题,然而session不是设计为线E安全的Q所以让多个U程q一个sessionQ将发生资料q而发生؜q问题Q下面是一个标准类Q?/span>

import java.io.Serializable;
import net.sf.hibernate.HibernateException;
import net.sf.hibernate.Session;
import net.sf.hibernate.SessionFactory;
import net.sf.hibernate.Transaction;
public class HibernateSessionUtil implements Serializable
{
     //创徏U程局部变量 tLocalsess 
    public static final ThreadLocal tLocalsess = new ThreadLocal();
   //创徏U程局部变量 tLocaltx
public static final ThreadLocal tLocaltx = new ThreadLocal();
      //取得session
    public static Session currentSession(){
         //从线E变量tLocalsess中,取得当前session
Session session = (Session) tLocalsess.get();
//判断session是否为空Q如果ؓI,创Z个session,q付l线E变量tLocalsess
    try{
if (session == null){
session = openSession();
tLocalsess.set(session);
}
}catch (HibernateException e){
throw new InfrastructureException(e);
}
return session;
}
//关闭当前session
    public static void closeSession(){
         //从线E变量tLocalsess中,取得当前session
Session session = (Session) tLocalsess.get();
         //讄U程变量tLocalsess为空
tLocalsess.set(null);
try{
            //关闭session
if (session != null && session.isOpen()){
session.close();
}
}catch (HibernateException e){
throw new InfrastructureException(e);
}
}
//事物处理
    public static void beginTransaction(){
      //从线E变量tLocaltx中取得事物管理对象Transaction
        Transaction tx = (Transaction) tLocaltx.get();
try{
            //如果为空׃session中创Z个tx
if (tx == null){
tx = currentSession().beginTransaction();
tLocaltx.set(tx);
}
}catch (HibernateException e){
throw new InfrastructureException(e);
}
}
//提交事物
    public static void commitTransaction(){
      //取得事物
Transaction tx = (Transaction) tLocaltx.get();
try{
            //如果不ؓI就提交
if (tx != null && !tx.wasCommitted() && !tx.wasRolledBack())
tx.commit();
tLocaltx.set(null);
}catch (HibernateException e){
throw new InfrastructureException(e);
}
}
    //事物回滚    
    public static void rollbackTransaction(){
         //取得tx事物
Transaction tx = (Transaction) tLocaltx.get();
try{
            //变量清I?/span>
tLocaltx.set(null);
if (tx != null && !tx.wasCommitted() && !tx.wasRolledBack()){
                //事物回滚
tx.rollback();
}
}catch (HibernateException e){
throw new InfrastructureException(e);
}
}
   //取得session
private static Session openSession() throws HibernateException{
return getSessionFactory().openSession();
}
   //取得sessionFactory
private static SessionFactory getSessionFactory() throws HibernateException{
return SingletonSessionFactory.getInstance();
}
}
filter的代码:
public class HibernateSessionCloser implements Filter{
protected FilterConfig filterConfig = null;
public void init(FilterConfig filterConfig)throws ServletException{
this.filterConfig = filterConfig;
}
public void destroy(){
this.filterConfig = null;
}
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain)
throws IOException, ServletException {
try{
chain.doFilter(request, response);
}
finally{
try{
HibernateSessionUtil.commitTransaction();
}catch (InfrastructureException e){
HibernateSessionUtil.rollbackTransaction();
}finally{
HibernateSessionUtil.closeSession();
}
}
}
}
---------------------------------------------------------------------------------------

      (1)、悲觀鎖定QPessimistic LockingQ一如其名稱所C,悲觀的認定每ơ資料存取時Q其它的客戶端也會存取同一{資料,因此該{資料進行鎖定Q直到自己操作完成後解除鎖定?nbsp;

      悲觀鎖定通常透過pȝ或資料n本n的功能來實現Q依賴系i或資料庫本w提供的鎖定制QHibernatex如此Q可以利用Query?Criteria的setLockMode()Ҏ來設定要鎖定的表或列QRowQ及光定模式,可設定的鎖定模式有以下的qր:
  • LockMode.WRITEQ在insert或update時進行鎖定QHibernate會在save()Ҏ時自動獲得鎖定?
  • LockMode.UPGRADEQ利用SELECT ... FOR UPDATE進行鎖定?
  • LockMode.UPGRADE_NOWAITQ利用SELECT ... FOR UPDATE NOWAIT進行鎖定Q在Oracle環境下用?
  • LockMode.READQ在讀取記錄時Hibernate會自動獲得鎖定?
  • LockMode.NONEQ沒有鎖定?/span>

          (2)、樂觀鎖定QOptimistic lockingQ則樂觀的認料的存取很少發生同時存取的問,因而不作資料n層次上的鎖定Q為了維h的資料Q樂觀鎖定使用應用E式上的邏輯實現版本控制的解決?nbsp;

          在不實行悲觀鎖定{略的情況下Q資料不一致的情況一但發生,有幾個解決的ҎQ一E是先更新為主,一E是後更新的ZQ比較複雜的是檢查發生變動的資料來實現Q或是檢查所有屬性來實現樂觀鎖定?br />       要注意的是,由於樂觀鎖定是用系i׃的程式來控制Q而不是用資料n中的鎖定制Q因而如果有人特意自行更新版本訊息來過檢查Q則鎖定制會無效Q例如在上例中自行更改userV2的version屬性,使之與資料n中的版本號相同的話就不會有錯誤,像這樣版本號被更改Q或是由D料是由外部系ip來Q因而版本資a不受控制時Q鎖定機制將會有問題Q設a時必須注意?/p>



  • ? 2008-01-10 11:40 发表评论
    ]]>
    持久层的l成(? http://www.tkk7.com/human2008/archive/2008/01/10/174225.html??Thu, 10 Jan 2008 03:39:00 GMThttp://www.tkk7.com/human2008/archive/2008/01/10/174225.htmlhttp://www.tkk7.com/human2008/comments/174225.htmlhttp://www.tkk7.com/human2008/archive/2008/01/10/174225.html#Feedback0http://www.tkk7.com/human2008/comments/commentRss/174225.htmlhttp://www.tkk7.com/human2008/services/trackbacks/174225.html持久层的l成
        q一节的名字应该换成“ZHibernate的持久层的组?#8221;更合适一点,可是它太长了。既然Hibernate是用来开发持久层Q那么我先介l一下这个持久层中的各个元素?br /> 1.    POJOQPlain Old Java ObjectQ你可以把它看作是简单的JavaBean。一般说来,一张数据库表对应一个POJOQ也是对象/关系的一一映射?br /> 2.    DAOQ对于每一个POJOQ一般都有一个DAO与之对应Q承担所有关于该POJO的访问控制。实际上也就是控制了Ҏ据库中一张表的访问控制?br /> 3.    *.hbm.xml文gQ这个文件定义了POJO和数据库中的表是如何映射的,比如POJO中的字段对应数据库表中的哪个字段{等。一般每个映都用单独的文g来描qͼ也就是有一个POJO有一?.hbm.xml文g?br /> 4.    *.cfg.xml文gQ这个文件定义了Hibernate的基本信息,比如数据库驱动,用户名,密码{等q接信息Q也包括了所有要用的*.hbm.xml文gQ在初始化的时候,Hibernate会读取这个文件来扄应的映射文g完成对象/关系?br /> 我们q是以上文的例子来详l描qC下这里提到的各个元素的内宏V?br /> 1.    Student.javaQ?br /> 代码片段4Q?br />
    1. public class Student  implements java.io.Serializable 
    2. {
    3.     private String id;
    4.     private String name;
    5.     private Set courseSelections = new HashSet(0);
    6.     public Student() 
    7.     {
    8.     }
    9.     public String getId() 
    10.     {
    11.         return this.id;
    12.     }
    13.     
    14.     public void setId(String id) 
    15.     {
    16.         this.id = id;
    17.     }
    18.     public String getName() 
    19.     {
    20.         return this.name;
    21.     }
    22.     
    23.     public void setName(String name) 
    24.     {
    25.         this.name = name;
    26.     }
    27.     public Set getCourseSelections() 
    28.     {
    29.         return this.courseSelections;
    30.     }
    31.     
    32.     public void setCourseSelections(Set courseSelections) 
    33.     {
    34.         this.courseSelections = courseSelections;
    35.     }
    36. }

    q个cd是一个POJOQ你可以很明昄看出来它是一个JavaBean。我惌释它的courseSelection字段。很昄Q在数据库表student中,没有q个字段。这里的q个字段是因Z个外键引用,course_selection的student_id是一个外键,引用了student表中的id字段。那么在StudentcMcourseSelection来记录这L外键关系Q也是_当我们获取了Student对象以后Q就可以直接获取他的选课记录Q这样就Z层的调用提供了很大的方便。这里有Ҏp没关系Q我在介l映定义文Ӟ*.hbm.xmlQ的时候还会提到这个问题?br /> 2.    StudentDAO.java
    代码片段5Q?br />
    1. public class StudentDAO 
    2. {
    3.     Session session;
    4.     public StudentDAO()
    5.     {
    6.         Configuration cfg = new Configuration();
    7.         cfg.configure("/hibernate.cfg.xml");
    8.         SessionFactory sessionFactory = cfg.buildSessionFactory();
    9.         session = sessionFactory.openSession();
    10.     }
    11.     
    12.     public void save(Student transientInstance) 
    13.     {
    14.         session.save(transientInstance);
    15.     }
    16.     
    17.     public void delete(Student persistentInstance) 
    18.     {
    19.         session.delete(persistentInstance);
    20.     }
    21.     
    22.     public Student findById(java.lang.String id) 
    23.     {
    24.         List list = session.createCriteria(Student.class).add(
    25. Expression.eq("id", id)).list();
    26.         if (list.size() > 0) 
    27.         {
    28.             return (Student)list.get(0);
    29.         }
    30.         return null;
    31.     }
    32. }

    q里的构造函数是用来启动HibernateQƈ获取session。打开一个sessionq当于打开了一个数据库q接Q然后我们就可以对这个sessionq行操作Q完成数据库操作Q完全不用写SQL语句。我q里Hibernate的启动方式写的很不规范,pȝ应该只需要完成一ơHibernate启动可以在不同的DAO中用,我把它写在构造函数里面纯_ҎZ化演CZ码?br /> 你可以看到save和deleteҎ都很单直接对对象操作Q而findById有些麻烦,因ؓq里有一个查询过E在里面。Hibernate里面查询可以用Criteriaq个cL完成Q我们也常用Hibernate独有的HQLQHibernate Query LanguageQ来完成查询。当然Hibernate也是支持原生SQL的。关于查询的详细信息请参考其他文章或书籍Q我只是演示一个流E,介绍一些概c?br /> 3.    Student.hbm.xml
    代码片段6Q?br />
    1. <hibernate-mapping>
    2.     <class name="Student" table="STUDENT">
    3.         <id name="id" type="string">
    4.             <column name="ID" length="10" />
    5.             <generator class="assigned" />
    6.         </id>
    7.         <property name="name" type="string">
    8.             <column name="NAME" not-null="true" />
    9.         </property>
    10.         <set name="courseSelections" inverse="true">
    11.             <key>
    12.                 <column name="STUDENT_ID" length="10" 
    13. not-null="true" />
    14.             </key>
    15.             <one-to-many class="CourseSelection" />
    16.         </set>
    17.     </class>
    18. </hibernate-mapping>

    q个文g定义了StudentcdStudent表是如何映射的。class元素定义了SudentcdSTUDENT表映,然后定义了各个属性是如何映射的。如果一个属性是数据库的keyQ那么会用id标签来定义,column定义了当前类的属性和数据库中的哪个字D对应,generator是idҎ的。一般来说id是自增的Q由于我的数据库是用的OracleQ它没有自增字段Q要实现自增必须用SequenceQ这出了本文的范围Q所以我qassigned来简化示例代码。assigned表示id是用L定的?br /> 有一个比较特别的标签是setQ它对应着数据库中的外键关p,上文我提到的通过Student对象可以获得所有相关的选课记录是通过q里的定义实现的。name属性对应了StudentcM的字D名Qkey表示哪个字段是外键,one-to-many表示Student和CourseSelection是一对多关系Q这和事实相W。类似的q有many-to-oneQmany-to-manyQ不q这些都不常用,我不介绍了。HibernateҎq个映射定义文gQ在实例化一个POJOQ比如StudentQ的时候,会自动的把定义过映射的属性用数据库中的数据填充,set也包括在内?br /> 4.    hibernate.cfg.xml
    代码片段7Q?br />
    1. <hibernate-configuration>
    2.     <session-factory>
    3.         <property name="connection.username">test</property>
    4.         <property name="connection.url">
    5. jdbc:oracle:thin:@10.85.33.199:1521:glee</property>
    6.         <property name="dialect">
    7. org.hibernate.dialect.Oracle9Dialect</property>
    8.         <property name="connection.password">test</property>
    9.         <property name="connection.driver_class">
    10. oracle.jdbc.OracleDriver</property>
    11.         <mapping resource="Student.hbm.xml"></mapping>
    12.         <mapping resource="CourseSelection.hbm.xml"></mapping>
    13.         <mapping resource="Course.hbm.xml"></mapping>
    14.     </session-factory>
    15. </hibernate-configuration>

    q个文g我不解释了,自己看吧。结合上文StudentDAO的例子,我想你应该能看明白?br /> 看了q么多,或许你会有点头皮发麻QPOJOQDAOQ配|文?..好像要写的东西还是很多。值得庆幸的是现在Hibernate已经发展的比较成熟了Q有很多工具来帮助我们完成这些工作,比如MiddleGenQHibernate Synchronizer{等。我使用的开发工hEclipse+MyEclipseQ我所要做的只是把数据库表建好Q然后MyEclipse提供的工具会自动Ҏ数据库表生成POJOQDAOQ?.hbm.xmlQ甚至hibernate.cfg.xml都是自动完成的(前提是MyEclipse知道你的数据库连接信息)。我q不打算介绍如何用IDE来开发HibernateQ你可以参考IDE的帮助文档?br /> 到这里ؓ止,使用Hibernateq行开发的基本l成元素我都介绍好了Q强烈徏议你马上实践一遍,即有些不理解,也先依葫芦画瓢一个。对了,别忘了把Hibernate的包down下来攑ֈclasspath里面?br />
    三、Session与SessionFactory
    Session可以说是Hibernate的核心,Hibernate对外暴露的接口就是Session。所以我q里讲一下有关Session的常用函数和Ҏ?br /> 在讲Session之前Q我惛_提一下SessionFactoryQ这个东西不复杂Q只要配|好p了。顾名思义QSessionFactory是用来创徏Session的。SessionFactory是线E安全的Q也是说对于同一个数据库的所有操作共享一个SessionFactoryp了。回头看代码片段5Q我们可以看到SessionFactory的常用配|方式?br /> 代码片段8Q?br />
    1. Configuration cfg = new Configuration();
    2. cfg.configure("/hibernate.cfg.xml");
    3. SessionFactory sessionFactory = cfg.buildSessionFactory();

    我们通过Configuration来读取配|文Ӟ然后可以创建SessionFactoryQ这D代码在    所有系l中都大同小异,一般就是xml配置文g的名字不一P所以也没什么好说的?br /> 当我们有了SessionFactory以后可以获取Session了。调用SessionFactory.openSession()׃q回一个Session实例Q然后我们操作这个Session来访问数据库。值得一提的是Sessionq不是线E安全的Q也是每一个线E都必须有自qSession。所以我们一般通过以下Ҏ来获取和关闭SessionQ?br /> 代码片段9Q?br />
    1. public static Session currentSession() throws HibernateException 
    2.     {
    3.         Session session = (Session) threadLocal.get();
    4.         if (session == null || !session.isOpen()) 
    5.         {
    6.             if (sessionFactory == null
    7.             {
    8.                 try 
    9.                 {
    10.                     cfg.configure(CONFIG_FILE_LOCATION);
    11.                     sessionFactory = cfg.buildSessionFactory();
    12.                 } 
    13.                 catch (Exception e) 
    14.                 {
    15.                     e.printStackTrace();
    16.                 }
    17.             }
    18.             session = (sessionFactory != null) ?
    19.                  sessionFactory.openSession(): null;
    20.             threadLocal.set(session);
    21.         }
    22.         return session;
    23. }
    24. public static void closeSession() throws HibernateException 
    25.     {
    26.         Session session = (Session) threadLocal.get();
    27.         threadLocal.set(null);
    28.         if (session != null
    29.         {
    30.             session.close();
    31.         }
    32. }

    可以看到Q我们通过threadLocal来保存每个线E的sessionQ这样就保证了各个线E之    间的互不q扰Q也保证了系l只有一个SessionFactory实例Q对于大多数应用来说已经    _了)。如果你使用MyEclipseq行开发的话,它会自动生成一?nbsp;   HibernateSessionFactory.javaQ其中就包含了以上代码?br /> 好了Q现在我们已l获得了SessionQ下面我来介l以下Session的常用函敎ͼq些函数都有很多重蝲函数Q我只介l以下大概是q嘛的,不一一解释Q详l信息你可以查看Hibernate的API?br /> 1QSession.get()Q获取某个类的实例,一般都是通过id来获取比?br /> Session.get(Student.class, "0361095");
    q句话的意思就是获取idQprimary keyQؓ“0361095”的Student对象。这里要?nbsp;   意的是第二个参数必须是ObjectQ也是_如果是longcd?Q那么必{?nbsp;   成new Long(1)再传入?br /> 2QSession.load()Q用法和意义都和get一P不过它们q是有点区别Q我E后解释?br /> 3QSession.save()Q将某个实例保存到数据库中去Q往往在数据库中Ş成一条新的记录)?br /> 4QSession.update()Q更新某个实例,q个实例必须和数据库中有对应Q否则会报错?br /> 5QSession.delete()Q删除某个实例,也就是删除这个实例对应的数据表中的数据?br /> 6QSession.saveOrUpdate()Q保存或者更新某个实例,调用q个Ҏ你就不用d心到        底是saveq是update了,它会自己判断Q然后调用相应的函数。其实save和update        涉及到实体对象生命周期中的三U状态,q个比较重要Q我在后面会单独讲的?br /> 对于get和load的区别,很难讲清楚,q里涉及到Hibernate的缓存机Ӟ是一个非?nbsp;   复杂的话题,我不打算深入讨论q个内容。简单的来讲QSession实现了Hibernate的一    U缓存,SessionFactory实现了Hibernate的二U缓存。loadҎ会先查找一U缓存再?nbsp;   找二U缓存,最后再L据库中找Q而get只会查找一U缓存,然后去数据库中找了?nbsp;   q只是是get和load的一个区别,另外的区别如果你有兴的话自己去google吧。关于Hibernate的缓存机Ӟ如果你只是一般用用Hibernate的话没有必要深入研究Q就当它不存在好了,get和load到底用哪个也不用非常讲究Q如果你用工L成DAO的话Q?nbsp;   生成的代码用什么就用什么吧?br />
    四、关键概늚理解
    在用Hibernateq行开发的时候有几个概念在我看来是必ȝ解的Q否则在开发的时候会遇到很多问题而摸不着头脑?br /> 1QLazy loadingQ懒加蝲Qgq加载)
    q个技术在很多地方被应用,比如Eclipse的插件管理也是用的gq加载。在Hibernate中,所谓gq加载就是返回一个POJO但是某些数据Q往往是实体类型或者SetcdQƈ没有被真正的被填充,直到POJO的某个字D늜正被引用的时候才从数据库中读取相应的数据来填充POJO中的字段。这样就能有效的避免很多不必要的数据库操作,因ؓPOJO的有些数据我们ƈ不需要,而且数据库操作是很费旉的。在Hibernate2中,默认是非延迟加蝲的,而在Hibernate3中,默认是延迟加蝲了?br /> 如果使用了gq加载,那么在读取数据的时候有一个问题必L意,那就是在数据真正被加载之前,Session不能被关闭。你可以回头看一下代码片D?Q我在构造函数里面open了session以后没有关闭这个sessionQ所以我在用的时候没有什么问题,但这hd着数据库连接也不好Q用好了应该及时关闭l别人用。我上文l的例子中没有关闭Session的代码,要加的话lDAO加一个方法调用Session.close()Q然后在代码片段1中的return之前调用q个Ҏp了?br /> Hibernate的gq加载机制远不是q么单,但是普通的应用没有必要LI这些东西,了解q么多就够了?br />
    2Q?nbsp;Object lifecycleQ对象生命周?br /> 在Hibernate中,对象分ؓ三种状态,TransientQ自q态)、PersistentQ持久状态)QDetachedQ游ȝ态)Q下面我分别解释一下?br /> 1、自q态:所谓自q态就是说q个对象是自qQ与Hibernate无关Q比       如:
    Student student = new Student();
        student.setId("0361095");
                    q里的student是一个普通的对象与hibernate无关Q称q态?br />
    2、持久状态:所谓持久状态就是指对象和数据库中的数据Q持久状态的数据Q?nbsp;      有关联,也就是说对象被Hibernate所理了,比如Q?br /> session.save(student);
       q样student对象׃自由状态变为持久状态了。持久状态的对象在Session       与数据库中的数据q行同步Ӟ比如commitQ会把数据更新到数据库。?nbsp;        其他状态的则不会。我觉得可以q样来理解持久状态,可以看成Hibernate       也拥有一份对象的引用Q那么如果你Ҏ久状态对象的属性进行更改的话,       Hibernate看到的对象的状态也更改了,而Hibernate所看到的对象和数据       库中的数据是{h的。也正是q样QHibernate才实CObject/Relation       的映。类似的Qload和getҎ也一样会获取Persistent状态的对象?br />
    3、游ȝ态:每次调用Session.close以后Q所有跟q个session有关的处?br /> Persistant的对象就变成了游ȝ态。也怽要问Detached和Transient有什么区别。其实从我给的例子来说看不出什么区别,因ؓ我这里ID是给定的Q而真正开发的时候ID往往是自增的Q那么Transient的对象是没有ID    的,当save了以后就有了Q显而易见Detached的对象也是有IDQ只不过q个对象已经和Hibernateq了关pR但是游ȝ态的对象仍然和数据库    中的记录有一定联p,臛_游离状态的对象知道数据库中有条记录的ID为xxx。从q一点上来讲Q游ȝ态是可以自己创造出来的Q只要你知道数据库中的主键信息?br /> 在用Hibernate开发的时候要分清楚这三种状态,否则很容易出错。比如不能去save一个游ȝ态的对象Q不能去update一个自q态的对象{等?br />
    五、结束语
    我要讲的p么多Q这文章不是详l介lHibernateQ我只是ȝ了自己学习和使用Hibernate的一些感受和l验Q希望能l没有用qHibernate的开发者一个上手的指引。如果你看完了这文章仍然满头雾_无从下手的话Q我只能向你表示歉意Q浪费你的时间了。不怎样Q我强烈推荐一本书《深入浅出Hibernate》,q本书既能作为学习的教程Q也能作为日后的查询用书Q相当实用?

    ? 2008-01-10 11:39 发表评论
    ]]>
    վ֩ģ壺 þþþһƷ޹ۺAV| ػaëƬƵ| ձ| ɫƵ15| ĻӰƵۿ| avƬ߹ۿ| ѹۿ| վɫƬѸ| һ߹ۿ| һƵ| Ҹ鶹| aaaƬѿ| 2017| Ļ| ޸һ| ƷƷŮѹۿ| һѻɫƬ| ƷƬ߹ۿ | Ļѹۿַ | ƷƵ| ޾Ʒþǧն| ĻӰȫѰ| jizz| vvvv99պƷ| ھƷƵѡ߹ۿ | Ļþһ| һëƬѹۿ| ޾Ʒ123߹ۿ| ۺ ŷ ˿| ĻӰ| AVһ| һ | ߲| 1aëƬѹۿ| ޾ƷƷƷ| þ㽶߿ۿƬ| һ| ɫƷƵ| ޽վƵ| ˳߹ۿվƷձ| ܳƵѹۿ|