??xml version="1.0" encoding="utf-8" standalone="yes"?>日韩久久免费av,免费视频久久,www.九色在线http://www.aygfsteel.com/jdyao/category/8354.htmlzh-cnTue, 27 Feb 2007 12:18:57 GMTTue, 27 Feb 2007 12:18:57 GMT60Hibernate Cache相关资料攉http://www.aygfsteel.com/jdyao/articles/37177.html襉K村里?/dc:creator>襉K村里?/author>Fri, 24 Mar 2006 03:48:00 GMThttp://www.aygfsteel.com/jdyao/articles/37177.htmlhttp://www.aygfsteel.com/jdyao/comments/37177.htmlhttp://www.aygfsteel.com/jdyao/articles/37177.html#Feedback0http://www.aygfsteel.com/jdyao/comments/commentRss/37177.htmlhttp://www.aygfsteel.com/jdyao/services/trackbacks/37177.htmlImproving Hibernate's Performance
   This chapter describes how to gather performance metrics for the use of Hibernate in the field. Specific attention is giving to key areas like collections and lazy loading of data.

2?a >Using Coherence and Hibernate

3?a >Ehcache

4?a >http://swik.net/cache

5?a >Speed Up Your Hibernate Applications with Second-Level Caching



]]>
Hibernate对象兌--UML基础知识、XDoclet---- 5 XDoclet Template In Eclipsehttp://www.aygfsteel.com/jdyao/articles/34910.html襉K村里?/dc:creator>襉K村里?/author>Sun, 12 Mar 2006 07:13:00 GMThttp://www.aygfsteel.com/jdyao/articles/34910.htmlhttp://www.aygfsteel.com/jdyao/comments/34910.htmlhttp://www.aygfsteel.com/jdyao/articles/34910.html#Feedback0http://www.aygfsteel.com/jdyao/comments/commentRss/34910.htmlhttp://www.aygfsteel.com/jdyao/services/trackbacks/34910.html 
<?xml version="1.0" encoding="UTF-8"?>
<templates><template name="@hib-blob-byte" description="blob to byte" context="javadoc" enabled="true" deleted="false" autoinsert="true">@hibernate.property column="${enclosing_method}"  type="org.springframework.orm.hibernate3.support.BlobByteArrayType" lazy="true"&#13;     &#13;     &#13;     </template><template name="@hib-class" description="@hibernate.class" context="javadoc" enabled="true" deleted="false" autoinsert="true">@hibernate.class table="${enclosing_type}" dynamic-update="true"</template><template name="@hib-class-disc" description="@hibernate.discriminator" context="javadoc" enabled="true" deleted="false" autoinsert="true">@hibernate.discriminator column="type" type="character" not-null="true" force="false"</template><template name="@hib-class-join" description="hibernate join subclass" context="javadoc" enabled="true" deleted="false" autoinsert="true">@hibernate.joined-subclass table="${primary_type_name}" lazy="true" dynamic-update="true"&#13;
*@hibernate.joined-subclass-key column="${primary_type_name}Guid"&#13;*&#13;*请修改子cȝ表名Q对应表的主键,该主键不需要定义在cȝ属性中Q它对应父类的主?amp;#13;
 </template><template name="@hib-class-sub" description="@hibernate.subclass" context="javadoc" enabled="true" deleted="false" autoinsert="true">@hibernate.subclass name="${file}" discriminator-value=""</template><template name="@hib-id-assign" description="id is assign" context="javadoc" enabled="true" deleted="false" autoinsert="true">@hibernate.id generator-class="assigned" length="20" column="请修?&#13;</template><template name="@hib-id-guid" description="id is guid" context="javadoc" enabled="true" deleted="false" autoinsert="true">@hibernate.id generator-class="uuid" type="java.lang.String" &#13;
    * @hibernate.column name="guid" sql-type="VARCHAR(38)" not-null="true"&#13;    *&#13;
    * 请修改name of column的?lt;/template><template name="@hib-rel-many-to-many-list" description="many to many list" context="javadoc" enabled="true" deleted="false" autoinsert="true">@hibernate.list name="Ҏ名(无GetQ? inverse="true" cascade="save-update"&#13;
     *                 lazy="true"&#13;
     * @hibernate.collection-key column="外键"&#13;
     * @hibernate.collection-index column="tabIndex" type="int"&#13;
     * @hibernate.collection-one-to-many class="兌的类"&#13;
     * &#13;
     * 请修改外键,q且指定完整的关联类的类名(?cdQ?lt;/template><template name="@hib-rel-many-to-many-set" description="many 2 many set" context="javadoc" enabled="true" deleted="false" autoinsert="true">@hibernate.set name="${enclosing_method}" table="兌? cascade="save-update" inverse="true" lazy="true"&#13;     * @hibernate.collection-key column="自己的主?&#13;     * @hibernate.collection-many-to-many class="兌c? column="兌cȝ主键"&#13;     *&#13;     * 两个cȝ主键构成兌表的属性,兌c请写完整的cd&#13;     * 多对多时Q只能指定一个多的方向断子ؓtrueQ即inverse="true"&#13;     * 多对多时Q无法指定index序Q因Z无法定从两个方向看上去都具有顺序,所以用List不可?amp;#13;</template><template name="@hib-rel-many-to-one" description="@hibernate.many-to-one" context="javadoc" enabled="true" deleted="false" autoinsert="true">@hibernate.many-to-one column="${enclosing_method}_ID" class="${return_type}" cascade="none" outer-join="auto" not-null="false" lazy="true"
     *&#13;     * Lclass指定完整的包?cd
     * @return ${return_type}
     *</template><template name="@hib-rel-one-to-many-list" description="@hibernate.one-to-many relationship" context="javadoc" enabled="true" deleted="false" autoinsert="true">@hibernate.list name="${enclosing_method}" inverse="true"    cascade="save-update" lazy="true"&#13;     * @hibernate.collection-key column="外键"&#13;     * @hibernate.collection-index column="TABINDEX" type="int"&#13;     * @hibernate.collection-one-to-many class="兌的类"&#13;     *&#13;     * 请修改外键,q且指定完整的关联类的类名(?cdQ?amp;#13;</template><template name="@hib-rel-one-to-many-set" description="one 2 many set" context="javadoc" enabled="true" deleted="false" autoinsert="true">@hibernate.set name="${enclosing_method}" inverse="true"    cascade="save-update" lazy="true"&#13;
     * @hibernate.collection-key column="外键"&#13;
     * @hibernate.collection-one-to-many class="兌的类"&#13;
     *&#13;
     * 请修改外键,q且指定完整的关联类的类名(?cdQ?amp;#13;
</template><template name="@hib-rel-parent-child-list" description="one to mang [construct a tree]" context="javadoc" enabled="true" deleted="false" autoinsert="true">@hibernate.list lazy="true" inverse="true" cascade="all"&#13;
     * @hibernate.collection-key column="parentGuid"&#13;
     * @hibernate.collection-index column="tabIndex"&#13;
     * @hibernate.collection-one-to-many class="${enclosing_package}.${primary_type_name}"&#13;
     *&#13;
     * 请修改collection-keyQ它是many方的外键&#13;
     * tabIndex可以修改Q也可以不修改,而且cM不必要一定有q个属性存在,因ؓ它是Hib在操作List旉要的一个属性,只需数据库中定义了即可?amp;#13;
&#13;
</template><template name="@hib-string-clob" description="hibernate string to clob" context="javadoc" enabled="true" deleted="false" autoinsert="true">@hibernate.property name="${enclosing_method}" column="ORG_Description" type="org.springframework.orm.hibernate3.support.ClobStringType" not-null="false" unique="false" length="4000"&#13;</template></templates>

     如何倒入参考随W?br>     代码实例Q?br>    /**
     * @hibernate.id generator-class="uuid" type="java.lang.String"
     *               name="guid" column="A_GUID" length="38"
     *
     */
    public java.lang.String getGuid() {
        return orgGuid;
    }

     private Set childDepartment;

    /**
     * @hibernate.set lazy="false" cascade="all" lazy="true"
     * @hibernate.collection-key column="Superior_GUID"
     * @hibernate.collection-one-to-many class="model.Department"
     *
     * @return Set
     */
    public Set getChildDepartment() {
        return childDepartment;
    }

    public void setChildDepartment(Set childDepartment) {
        this.childDepartment = childDepartment;
    }
   
    private Set roles;
    /**
     * many to may
     *
     * @hibernate.set name="roles" table="ORG_DEPT_REF_ROLE"
     *                 cascade="save-update" inverse="true" lazy="true"
     * @hibernate.collection-key column="DEPT_GUID"
     * @hibernate.collection-many-to-many class="model.Role"
     *                                    column="ROLE_GUID"
     * @return Set
     */
    public Set getRoles() {
        return roles;
    }

    public void setRoles(Set roles) {
        this.roles = roles;
    }
   
    private List positions;

    /**
     *
     * @hibernate.list name="positions" inverse="true" cascade="save-update"
     *                 lazy="true"
     * @hibernate.collection-key column="DEPT_GUID"
     * @hibernate.collection-index column="POSITION_TABINDEX" type="int"
     * @hibernate.collection-one-to-many class="model.Position"
     *
     * 请修改外键,q且指定完整的关联类的类名(?cdQ?br>     */
    public List getPositions() {
        return positions;
    }

    public void setPositions(List positions) {
        this.positions = positions;
    }


]]>
Hibernate对象兌--UML基础知识、XDoclet---- 4 inverse And Cascadinghttp://www.aygfsteel.com/jdyao/articles/34899.html襉K村里?/dc:creator>襉K村里?/author>Sun, 12 Mar 2006 03:16:00 GMThttp://www.aygfsteel.com/jdyao/articles/34899.htmlhttp://www.aygfsteel.com/jdyao/comments/34899.htmlhttp://www.aygfsteel.com/jdyao/articles/34899.html#Feedback0http://www.aygfsteel.com/jdyao/comments/commentRss/34899.htmlhttp://www.aygfsteel.com/jdyao/services/trackbacks/34899.html   下面搜集了多Ҏ章,集中讨论q个问题Q?br>   重点是理解:UML中的多向性、导向性与inverse Qcascading之间的关p;以及inverse,cascading寚w合行为的影响力?br> 
一、引用Huihoo译Hibernate官方文档
   

2.3.  W二部分 Q?兌映射

我们已经映射了一个持久化实体cd一个表上。让我们在这个基上增加一些类之间的关联性? 首先我们往我们E序里面增加人(peopleQ的概念Qƈ存储他们所参与的一个Event列表? Q译者注Q与Event一P我们在后面的教程中将直接使用person来表C“h”而不是它的中文翻译)

2.3.1.  映射Personc?

最初的PersoncL单的Q?

public class Person {

private Long id;
private int age;
private String firstname;
private String lastname;

Person() {}

// Accessor methods for all properties, private setter for 'id'

}

Create a new mapping file called Person.hbm.xml:

<hibernate-mapping>

<class name="Person" table="PERSON">
<id name="id" column="PERSON_ID">
<generator class="increment"/>
</id>
<property name="age"/>
<property name="firstname"/>
<property name="lastname"/>
</class>

</hibernate-mapping>

Finally, add the new mapping to Hibernate's configuration:

        <mapping resource="Event.hbm.xml"/>
<mapping resource="Person.hbm.xml"/>

我们现在在q两个实体类之间创徏一个关联。显Ӟperson可以参与一pdEventQ而Event也有不同的参加者(personQ? 设计上面我们需要考虑的问题是兌的方向(directionalityQ,阶数QmultiplicityQ和集合QcollectionQ的行ؓ?

2.3.2.  一个单向的Set-based兌

我们向Personcd加一lEvent。这h们可以轻杄通过调用aPerson.getEvents() 得到一个Person所参与的Event列表Q而不必执行一个显式的查询。我们用一个Java的集合类Q一?tt class="literal">SetQ因为Set 不允许包括重复的元素而且排序和我们无兟?

目前为止我们设计了一个单向的Q在一端有许多g之对应的兌Q通过Set来实现? 让我们ؓq个在Javac里~码q映这个关联:

public class Person {

private Set events = new HashSet();

public Set getEvents() {
return events;
}

public void setEvents(Set events) {
this.events = events;
}
}

在我们映这个关联之前,先考虑q个兌另外一端。很昄的,我们可以保持q个兌是单向的。如果我们希望这个关联是双向的, 我们可以?tt class="literal">Event里创建另外一个集合,例如Q?tt class="literal">anEvent.getParticipants()? q是留给你的一个设计选项Q但是从q个讨论中我们可以很清楚的了解什么是兌的阶敎ͼmultiplicityQ:在这个关联的两端都是“多”? 我们叫这个ؓQ?span class="emphasis">多对多(many-to-manyQ?/em>兌。因此,我们使用Hibernate的many-to-many映射Q?

<class name="Person" table="PERSON">
<id name="id" column="PERSON_ID">
<generator class="increment"/>
</id>
<property name="age"/>
<property name="firstname"/>
<property name="lastname"/>

<set name="events" table="PERSON_EVENT">
<key column="PERSON_ID"/>
<many-to-many column="EVENT_ID" class="Event"/>
</set>

</class>

Hibernate支持所有种cȝ集合映射Q?tt class="literal"><set>是最普遍被用的。对于多对多Qmany-to-manyQ关?或者叫n:m实体关系), 需要一个用来储存关联的表(association tableQ?tt class="literal">?/tt>里面的每一行代表从一个personC个event的一个关联? 表名是由set元素?tt class="literal">table属性值配|的。关联里面的标识字段名,person的一端,? ?tt class="literal"><key>元素定义Qevent一端的字段名是?tt class="literal"><many-to-many>元素? column属性定义的。你也必d诉Hibernate集合中对象的c(也就是位于这个集合所代表的关联另外一端的c)?

q个映射的数据库表定义如下:

    _____________        __________________
| | | | _____________
| EVENTS | | PERSON_EVENT | | |
|_____________| |__________________| | PERSON |
| | | | |_____________|
| *EVENT_ID | <--> | *EVENT_ID | | |
| EVENT_DATE | | *PERSON_ID | <--> | *PERSON_ID |
| TITLE | |__________________| | AGE |
|_____________| | FIRSTNAME |
| LASTNAME |
|_____________|

2.3.3.  使关联工?

让我们把一些people和event攑ֈEventManager的一个新Ҏ中:

private void addPersonToEvent(Long personId, Long eventId) {
Session session = HibernateUtil.currentSession();
Transaction tx = session.beginTransaction();

Person aPerson = (Person) session.load(Person.class, personId);
Event anEvent = (Event) session.load(Event.class, eventId);

aPerson.getEvents().add(anEvent);

tx.commit();
HibernateUtil.closeSession();
}

在加载一?tt class="literal">Person和一?tt class="literal">Event之后Q简单的使用普通的Ҏ修改集合? 如你所见,没有昑ּ?tt class="literal">update()或?tt class="literal">save(), Hibernate自动到集合已经被修? q要保存。这个叫?span class="emphasis">automatic dirty checkingQ你也可以尝试修改Q何对象的name或者date的参数? 只要他们处于persistent状态,也就是被l定在某个Hibernate Session上(例如Q他? 刚刚在一个单元操作从被加载或者保存)QHibernate监视M改变q在后台隐式执行SQL。同步内存状态和数据库的q程Q通常只在 一个单元操作结束的时候发生,q个q程被叫?span class="emphasis">flushing?

你当然也可以在不同的单元操作里面加蝲person和event。或者在一?tt class="literal">Session以外修改一? 不是处在持久化(persistentQ状态下的对象(如果该对象以前曾l被持久化,我们U这个状态ؓqQdetachedQ?/em>Q? 在程序里Q看h像下面这P

    private void addPersonToEvent(Long personId, Long eventId) {

Session session = HibernateUtil.currentSession();
Transaction tx = session.beginTransaction();

Person aPerson = (Person) session.load(Person.class, personId);
Event anEvent = (Event) session.load(Event.class, eventId);

tx.commit();
HibernateUtil.closeSession();

aPerson.getEvents().add(anEvent); // aPerson is detached

Session session2 = HibernateUtil.currentSession();
Transaction tx2 = session.beginTransaction();

session2.update(aPerson); // Reattachment of aPerson

tx2.commit();
HibernateUtil.closeSession();
}

?tt class="literal">update的调用一个脱对象(detached objectQ重新持久化Q你可以说它被绑定到 一个新的单元操作上Q所以Q何你对它在脱(detachedQ状态下所做的修改都会被保存到数据库里?

q个Ҏ们当前的情Ş不是很有用,但是它是非常重要的概念,你可以把它设计进你自qE序中。现在,加进一个新? 选项?tt class="literal">EventManager的mainҎ中,q从命o行运行它来完成这个练习。如果你需要一个person? 一个event的标识符 Q?save()q回它?******q最后一句看不明?

上面是一个关于两个同{地位的c间兌的例子,q是在两个实体之间。像前面所提到的那P也存在其它的特别的类和类型,q些cdcd通常是“次要的”? 其中一些你已经看到q,好像int或?tt class="literal">String。我们称D些类?span class="emphasis">值类型(value typeQ?/em>, 它们的实?span class="emphasis">依赖QdependQ?/em>在某个特定的实体上。这些类型的实例没有自己的n份(identityQ,也不能在实体间共? Q比如两个person不能引用同一?tt class="literal">firstname对象Q即使他们有相同的名字)。当Ӟvalue typesq不仅仅在JDK中存? Q事实上Q在一个HibernateE序中,所有的JDKc都被视为值类型)Q你也可以写你自q依赖c,例如AddressQ? MonetaryAmount?

你也可以设计一个值类型的集合Qcollection of value typesQ,q个在概念上与实体的集合有很大的不同Q但是在Java里面看v来几乎是一L?

2.3.4.  值类型的集合

我们把一个值类型对象的集合加入Person。我们希望保存email地址Q所以我们?tt class="literal">StringQ? 而这ơ的集合cd又是SetQ?

private Set emailAddresses = new HashSet();

public Set getEmailAddresses() {
return emailAddresses;
}

public void setEmailAddresses(Set emailAddresses) {
this.emailAddresses = emailAddresses;
}

Set的映?

<set name="emailAddresses" table="PERSON_EMAIL_ADDR">
<key column="PERSON_ID"/>
<element type="string" column="EMAIL_ADDR"/>
</set>

比较q次和较早先的映,差别主要?tt class="literal">element部分q次q没有包括对其它实体cd的引用,而是使用一个元素类型是 String的集合(q里使用写的名字是向你表明它是一个Hibernate的映类型或者类型{换器Q? 和以前一Pset?tt class="literal">table参数军_用于集合的数据库表名?tt class="literal">key元素 定义了在集合表中使用的外键?tt class="literal">element元素?tt class="literal">column参数定义实际保存String? 的字D名?

看一下修改后的数据库表定义?

  _____________        __________________
| | | | _____________
| EVENTS | | PERSON_EVENT | | | ___________________
|_____________| |__________________| | PERSON | | |
| | | | |_____________| | PERSON_EMAIL_ADDR |
| *EVENT_ID | <--> | *EVENT_ID | | | |___________________|
| EVENT_DATE | | *PERSON_ID | <--> | *PERSON_ID | <--> | *PERSON_ID |
| TITLE | |__________________| | AGE | | *EMAIL_ADDR |
|_____________| | FIRSTNAME | |___________________|
| LASTNAME |
|_____________|

你可以看到集合表Qcollection tableQ的主键实际上是个复合主键,同时使用?个字Dc这也暗CZ对于同一? person不能有重复的email地址Q这正是Java里面使用Set时候所需要的语义QSet里元素不能重复)?

你现在可以试着把元素加入这个集合,像我们在之前关联person和event的那栗Java里面的代码是相同的?

2.3.5.  双向兌

下面我们映一个双向关联(bi-directional associationQ- 在Java里面让person和event可以从关联的 M一端访问另一端。当Ӟ数据库表定义没有改变Q我们仍焉要多对多Qmany-to-manyQ的阶数QmultiplicityQ。一个关pd数据库要比网l编E语a 更加灉|Q所以它q不需要Q何像D方向Qnavigation directionQ的东西 Q?数据可以用Q何可能的方式q行查看和获取?

首先Q把一个参与者(personQ的集合加入EventcMQ?

private Set participants = new HashSet();

public Set getParticipants() {
return participants;
}

public void setParticipants(Set participants) {
this.participants = participants;
}

?tt class="literal">Event.hbm.xml里面也映这个关联?

<set name="participants" table="PERSON_EVENT" inverse="true">
<key column="EVENT_ID"/>
<many-to-many column="PERSON_ID" class="Person"/>
</set>

如你所见,2个映文仉都有通常?tt class="literal">set映射。注?tt class="literal">key?tt class="literal">many-to-many 里面的字D名在两个映文件中是交换的。这里最重要的不同是Event映射文g?tt class="literal">set元素? inverse="true"参数?

q个表示Hibernate需要在两个实体间查扑օ联信息的时候,应该使用兌的另外一?Q?PersoncR? q将会极大的帮助你理解双向关联是如何在我们的两个实体间创建的?

2.3.6.  使双向关联工?

首先Q请牢记在心QHibernateq不影响通常的Java语义? 在单向关联中Q我们是怎样在一?tt class="literal">Person和一?tt class="literal">Event之间创徏联系的? 我们把一?tt class="literal">Event的实例加C?tt class="literal">Personcd的Event集合里。所以,昄如果我们要让q个兌可以双向工作Q? 我们需要在另外一端做同样的事?Q??tt class="literal">Person加到一?tt class="literal">Eventcd的Person集合中? q“在兌的两端设|联pZ是l对必要的而且你永q不应该忘记做它?

许多开发者通过创徏理兌的方法来保证正确的设|了兌的两端,比如?tt class="literal">Person里:

protected Set getEvents() {
return events;
}

protected void setEvents(Set events) {
this.events = events;
}

public void addToEvent(Event event) {
this.getEvents().add(event);
event.getParticipants().add(this);
}

public void removeFromEvent(Event event) {
this.getEvents().remove(event);
event.getParticipants().remove(this);
}

注意现在对于集合的get和setҎ的访问控制别是protected - q允许在位于同一个包QpackageQ中的类以及l承自这个类的子c? 可以讉Kq些ҎQ但是禁止其它的直接外部讉KQ避免了集合的内容出现؜乱。你应该可能的在集合所对应的另外一端也q样做?

inverse映射参数I竟表示什么呢Q对于你和对于Java来说Q一个双向关联仅仅是在两端简单的讄引用。然而仅仅这? Hibernateq没有够的信息L的产生INSERT?tt class="literal">UPDATE语句Q以避免q反数据库约束)Q? 所以Hibernate需要一些帮助来正确的处理双向关联。把兌的一端设|ؓinverse告诉Hibernate忽略兌? q一端,把这端看成是另外一端的一?span class="emphasis">镜子QmirrorQ?/em>。这是Hibernate所需的信息,Hibernate用它来处理如何把? 一个数据导航模型映到关系数据库表定义? 你仅仅需要记住下面这个直观的规则Q所有的双向兌需要有一端被讄?tt class="literal">inverse。在一个一对多Qone-to-manyQ关联中 它必L代表多(manyQ的那端。而在多对多(many-to-manyQ关联中Q你可以L选取一端,两端之间q没有差别?/font>

   二、引用Huihoo译Hibernate官方文档

22.1. 关于collections需要注意的一?/font>

Hibernate collections被当作其所属实体而不是其包含实体的一个逻辑部分。这非常重要Q它主要体现Z下几点:

  • 当删除或增加collection中对象的时候,collection所属者的版本g递增?

  • 如果一个从collection中移除的对象是一个值类?value type)的实例,比如composite elementQ那么这个对象的持久化状态将会终止,其在数据库中对应的记录会被删除。同LQ向collection增加一个value type的实例将会之立卌持久化?

  • 另一斚wQ如果从一对多或多对多兌的collection中移除一个实体,在缺省情况下q个对象q不会被删除。这个行为是完全合乎逻辑的-Q改变一个实 体的内部状态不应该使与它关联的实体消失掉!同样的,向collection增加一个实体不会之被持久化?

实际上,向Collection增加一个实体的~省动作只是在两个实体之间创Z个连接而已Q同L除的时候也只是删除q接。这U处理对于所有的情况都是合适的。对于父子关pd是完全不适合的,在这U关pMQ子对象的生存绑定于父对象的生存周期?

22.2. 双向的一对多关系(Bidirectional one-to-many)

假设我们要实C个简单的从Parent到Child?lt;one-to-many>兌?

<set name="children">
<key column="parent_id"/>
<one-to-many class="Child"/>
</set>

如果我们q行下面的代?

Parent p = .....;
Child c = new Child();
p.getChildren().add(c);
session.save(c);
session.flush();

Hibernate会生两条SQL语句Q?

  • 一?tt class="literal">INSERT语句Qؓc创徏一条记?/font>

  • 一?tt class="literal">UPDATE语句Q创Zp?tt class="literal">c的连?

q样做不仅效率低Q而且q反了列parent_id非空的限制。我们可以通过在集合类映射上指?tt class="literal">not-null="true"来解册反非I约束的问题Q?

<set name="children">
<key column="parent_id" not-null="true"/>
<one-to-many class="Child"/>
</set>

然而,qƈ非是推荐的解x法?

q种现象的根本原因是?tt class="literal">p?tt class="literal">c的连接(外键parent_idQ没有被当作Child对象状态的一部分Q因而没有在INSERT语句中被创徏。因此解决的办法是把这个连接添加到Child的映中?

<many-to-one name="parent" column="parent_id" not-null="true"/>

Q我们还需要ؓc?tt class="literal">Childdparent属性)

现在实体Child在管理连接的状态,Z使collection不更新连接,我们使用inverse属性?

<set name="children" inverse="true">
<key column="parent_id"/>
<one-to-many class="Child"/>
</set>

下面的代码是用来d一个新?tt class="literal">Child

Parent p = (Parent) session.load(Parent.class, pid);
Child c = new Child();
c.setParent(p);
p.getChildren().add(c);
session.save(c);
session.flush();

现在Q只会有一?tt class="literal">INSERT语句被执行!

Z让事情变得井井有条,可以?tt class="literal">Parent加一?tt class="literal">addChild()Ҏ?

public void addChild(Child c) {
c.setParent(this);
children.add(c);
}

现在Q添?tt class="literal">Child的代码就是这?

Parent p = (Parent) session.load(Parent.class, pid);
Child c = new Child();
p.addChild(c);
session.save(c);
session.flush();

22.3. U联生命周期QCascading lifecycleQ?/font>

需要显式调?tt class="literal">save()仍然很麻烦,我们可以用联来解决q个问题?

<set name="children" inverse="true" cascade="all">
<key column="parent_id"/>
<one-to-many class="Child"/>
</set>

q样上面的代码可以简化ؓQ?

Parent p = (Parent) session.load(Parent.class, pid);
Child c = new Child();
p.addChild(c);
session.flush();

同样的,保存或删?tt class="literal">Parent对象的时候ƈ不需要遍历其子对象? 下面的代码会删除对象p及其所有子对象对应的数据库记录?

Parent p = (Parent) session.load(Parent.class, pid);
session.delete(p);
session.flush();

然而,q段代码

Parent p = (Parent) session.load(Parent.class, pid);
Child c = (Child) p.getChildren().iterator().next();
p.getChildren().remove(c);
c.setParent(null);
session.flush();

不会从数据库删除cQ它只会删除?tt class="literal">p之间的连接(q且会导致违?tt class="literal">NOT NULLU束Q在q个例子中)。你需要显式调?tt class="literal">delete()来删?tt class="literal">Child?

Parent p = (Parent) session.load(Parent.class, pid);
Child c = (Child) p.getChildren().iterator().next();
p.getChildren().remove(c);
session.delete(c);
session.flush();

在我们的例子中,如果没有父对象,子对象就不应该存在,如果子对象从collection中移除,实际上我们是惛_除它。要实现q种要求Q就必须使用cascade="all-delete-orphan"?

<set name="children" inverse="true" cascade="all-delete-orphan">
<key column="parent_id"/>
<one-to-many class="Child"/>
</set>

注意Q即使在collection一方的映射中指?tt class="literal">inverse="true"Q联仍然是通过遍历collection中的元素来处理的。如果你惌通过U联q行子对象的插入、删除、更新操作,必L它加到collection中,只调?tt class="literal">setParent()是不够的?

22.4. U联?tt class="literal">未保存?/tt>QCascades and unsaved-valueQ?/font>

假设我们?tt class="literal">Session中装入了一?tt class="literal">Parent对象Q用L面对其进行了修改Q然后希望在一个新的Session里面调用update()来保存这些修攏V对?tt class="literal">Parent包含了子对象的集合,׃打开了联更斎ͼHibernate需要知道哪些Child对象是新实例化的Q哪些代表数据库中已l存在的记录。我们假?tt class="literal">Parent?tt class="literal">Child对象的标识属性都是自动生成的Q类型ؓjava.lang.Long。Hibernate会用标识属性的|和version ?timestamp 属性,来判断哪些子对象是新的?参见?Hibernate3 ?昑ּ指定unsaved-value不再是必ȝ了?/em>

下面的代码会更新parent?tt class="literal">child对象Qƈ且插?tt class="literal">newChild对象?

//parent and child were both loaded in a previous session
parent.addChild(child);
Child newChild = new Child();
parent.addChild(newChild);
session.update(parent);



session.flush();

Well, that's all very well for the case of a generated identifier, but what about assigned identifiers and composite identifiers? This is more difficult, since Hibernate can't use the identifier property to distinguish between a newly instantiated object (with an identifier assigned by the user) and an object loaded in a previous session. In this case, Hibernate will either use the timestamp or version property, or will actually query the second-level cache or, worst case, the database, to see if the row exists.

q对于自动生成标识的情况是非常好的,但是自分配的标识和复合标识怎么办呢Q这是有炚w烦,因ؓHibernate没有办法区分新实例化的对象(标识被用 h定了Q和前一个Session装入的对象。在q种情况下,Hibernate会用timestamp或version属性,或者查询第二~存Q或 者最坏的情况Q查询数据库Q来认是否此行存在?/font>

   三、实战ȝ
   1、inversecMUML图中的导向?one-manyӞ如果你设计的cL先整体,后部分,那么整体一端应该inverse为true?br>      many-manyӞ如果其中一端是业务语义的根Q另一端的存在依附于根Q那么根q一端的inverse为trueQ否则配|ؓfalse.如果两端都配|ؓtrueQ关联表中就无法写入数据Q如果两端都配置为falseQ你׃能同时a.addB(b),b.addA(a)的方式互相放入对方的集合中,否则会发生冲H?br>  
   2、Cascading配置了类之间的行为媄响程度。本文引用的W二大节讲的很清楚。在实际使用Ӟq是要注意其用法与业务的兌Q?br>    如果只删除关联关p,通常配置save-update / none
    如果把子端全部删除,配置为all?br>  
  3、Set在用时。many-one,删除oneӞcascading必须为all。如果是save-update,none都会出现“违反完整约束条件”的错误?br>                  many-manyQA-B)ӞA方cascading为allӞ删除Ac,B、AB兌信息都会被删除?br>                                     A方cascading为save-updateӞ删除Ac,AB兌信息会被删除QB保留?br>                                     A方cascading为none?删除Ac,B、AB兌信息都会保留?br>  4、List使用Ӟ首先必须保index的值必设|,否则q背了List序位置的概念,无法完成删除逻辑的正性,且会throw“违反完整约束条件”的错误?br>     在正给定了index后,其行ZSet相同?br>

]]>
Hibernate对象兌--UML基础知识、XDoclet----2 Hibernate 兌(摘自Huihoo|站)http://www.aygfsteel.com/jdyao/articles/34872.html襉K村里?/dc:creator>襉K村里?/author>Sat, 11 Mar 2006 14:22:00 GMThttp://www.aygfsteel.com/jdyao/articles/34872.htmlhttp://www.aygfsteel.com/jdyao/comments/34872.htmlhttp://www.aygfsteel.com/jdyao/articles/34872.html#Feedback0http://www.aygfsteel.com/jdyao/comments/commentRss/34872.htmlhttp://www.aygfsteel.com/jdyao/services/trackbacks/34872.html6. 对象/关系数据库映基(Basic O/R Mapping)

6.1.10. 多对一Qmany-to-oneQ?/span>

6.1.11. 一对一

7. 集合c?Collections)映射

7.1. 持久化集合类(Persistent collections)

7.2. 集合映射Q?Collection mappings Q?/span>

7.2.1. 集合外键(Collection foreign keys)

7.2.2. 集合?span lang="EN-US">素(Collection elementsQ?/span>

7.2.3. 索引集合c?Indexed collections)

7.2.4. 值集合于多对多关?Collections of values and many-to-many associations)

7.2.5. 一对多兌QOne-to-many AssociationsQ?/span>

7.3. 高集合映射QAdvanced collection mappingsQ?/span>

7.3.1. 有序集合QSorted collectionsQ?/span>

7.3.2. 双向兌QBidirectional associationsQ?/span>

7.3.3. 三重兌QTernary associationsQ?/span>

7.3.4. 使用<idbag>

7.4. 集合例子QCollection exampleQ?/span>

8. 兌关系映射

8.1. 介绍

8.2. 单向兌QUnidirectional associationsQ?/span>

8.2.1. 多对一(many to one)

8.2.2. 一对一Qone to oneQ?/span>

8.2.3. 一对多Qone to manyQ?/span>

8.3. 使用q接表的单向兌QUnidirectional associations with join tablesQ?/span>

8.3.1. 一对多(one to many)

8.3.2. 多对一Qmany to oneQ?/span>

8.3.3. 一对一Qone to oneQ?/span>

8.3.4. 多对多(many to manyQ?/span>

8.4. 双向兌QBidirectional associationsQ?/span>

8.4.1. 一对多Qone to many) / 多对一Qmany to oneQ?/span>

8.4.2. 一对一Qone to oneQ?/span>

8.5. 使用q接表的双向兌QBidirectional associations with join tablesQ?/span>

8.5.1. 一对多Qone to manyQ?/多对一Q? many to oneQ?/span>

8.5.2. 一对一Qone to oneQ?/span>

8.5.3. 多对多(many to manyQ?/span>



]]>
Hibernate对象兌--UML基础知识、XDoclet--- 1 UML基础部分Q来自UMLchina|站Q?/title><link>http://www.aygfsteel.com/jdyao/articles/34871.html</link><dc:creator>襉K村里?/dc:creator><author>襉K村里?/author><pubDate>Sat, 11 Mar 2006 14:17:00 GMT</pubDate><guid>http://www.aygfsteel.com/jdyao/articles/34871.html</guid><wfw:comment>http://www.aygfsteel.com/jdyao/comments/34871.html</wfw:comment><comments>http://www.aygfsteel.com/jdyao/articles/34871.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/jdyao/comments/commentRss/34871.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/jdyao/services/trackbacks/34871.html</trackback:ping><description><![CDATA[<table align="center" border="0" cellpadding="0" cellspacing="0" height="38" width="760"> <tbody> <tr> <td align="center" width="129"> <object codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,0,0" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" height="71" width="100"><param name="_cx" value="2646"><param name="_cy" value="1879"><param name="FlashVars" value=""><param name="Movie" value="../images/logo.swf"><param name="Src" value="../images/logo.swf"><param name="WMode" value="Window"><param name="Play" value="-1"><param name="Loop" value="-1"><param name="Quality" value="High"><param name="SAlign" value=""><param name="Menu" value="-1"><param name="Base" value=""><param name="AllowScriptAccess" value=""><param name="Scale" value="ShowAll"><param name="DeviceFont" value="0"><param name="EmbedMovie" value="0"><param name="BGColor" value=""><param name="SWRemote" value=""><param name="MovieData" value=""><param name="SeamlessTabbing" value="1"><param name="Profile" value="0"><param name="ProfileAddress" value=""><param name="ProfilePort" value="0"> <embed src="../images/logo.swf" quality="high" pluginspage="http://www.macromedia.com/go/getflashplayer" type="application/x-shockwave-flash" height="71" width="100"></object><br></td> <td width="631"><b><font color="#008080" size="6">UML</font><font color="#008080"><font color="#008080" face="Ҏ姚体" size="6">软g工程</font><font face="Ҏ姚体" size="6">l织</font></font></b> <table align="right" border="0" width="60%"> <tbody> <tr> <td> <div align="center"><a class="content_a" target="_blank">    北京火龙果Y件工E技术中?/a></div></td></tr></tbody></table></td></tr></tbody></table> <hr noshade="noshade" size="1" width="760"> <table align="center" border="0" cellpadding="0" cellspacing="0" width="760"> <tbody> <tr> <td class="title" align="center" height="56" valign="center"><b><font color="#ff0000" size="3">UML 基础Q类?</font></b></td></tr> <tr> <td class="formtitle" align="center" height="40">选自QIBM</td></tr></tbody></table> <table align="center" border="0" cellpadding="0" cellspacing="0" height="65" width="760"> <tbody> <tr> <td class="content" height="65"> <table class="content" align="center" border="0" width="85%"> <tbody> <tr> <td class="content" valign="top"><span id="wmqeeuq" class="content">q是关于l一建模语言、即UML 里采用的基本囄一pd文章的一部分。在?先前关于序列囄文章 里,我把重点?UML 1.4 版,转移?OMG的采用UML 2.0版草案规范(又称为UML 2Q。在q篇文章中,我将会讨论结构图Q这是已l在 UML 2 中提出的一U新囄cR由于本pd文章的目的是使h们了解记号元素及它们的含意,该文主要xcd。你很快׃知道q样做的理由。随后的文章会覆盖l构范畴中包含的其它图? </span> <p class="content">我也x醒读者,q一pd文章是关?UML 记号元素的,所以这些文章ƈ不意味着为徏模的最好方式提供指导方针,或是该如何决定哪些内容应该首先被建模。相反的Q该文及本系列文章的目的主要是帮助大家对于记号元? -- 语法和含义有一个基本的理解。借由q些知识Q你应该可以阅读图,q用正的记号元素创徏你自q图?/p> <p class="content">q篇文章假定你对面向对象的设计已l有了基本的理解。你们当中如果有人需要一些面向对象概늚帮助Q那么可以访问http://java.sun.com/docs/books/tutorial/java/concepts/Q来获得Sun公司关于面向对象~程的简短指对{?i xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">阅读</i> “什么是c?”和 什么是l承Q?章节Q将提供l你_的理解,q对该文的阅M有所帮助。另外,David Taylor的书?Object-Oriented Technologies: A Manager's Guide》提供了面向对象设计的优UQ高水^的说明,而无需对计机~程有高q理解?/p> <p class="content"><a name="IDAATMUB">UML 2 中的阴和?/a><br>?UML 2 中有二种基本的图范畴Q结构图和行为图。每?UML N属于q二个图范畴。结构图的目的是昄建模pȝ的静态结构。它们包括类Q组件和Q或Q对象图。另一斚wQ行为图昄pȝ中的对象的动态行为,包括如对象的ҎQ协作和zd之类的内宏V行为图的实例是zd图,用例囑֒序列图?/p> <p class="content"><a name="IDAITMUB">大体上的l构?/a><br>如同我所说的Q结构图昄建模pȝ的静态结构。关注系l的元gQ无需考虑旉。在pȝ内,静态结构通过昄cd和它们的实例q行传播。除了显C系l类型和它们的实例,l构图至也昄了这些元素间的一些关p,可能的话Q甚至也昄它们的内部结构?/p> <p class="content">贯穿整个软g生命周期Q结构图对于各种团队成员都是有用的。一般而言Q这些图支持设计验证Q和个体与团队间的设计交。D例来_业务分析师可以用类或对象图Q来为当前的资和资源徏模,例如分类账,产品或地理层ơ。架构师可以使用lg和部|图Q来试/认他们的设计是否充分。开发者可以用类图,来设计ƈ为系l的代码Q或卛_成ؓ代码的)cd文档?/p><span id="wmqeeuq" class="content"><b xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">Ҏ的类?/b> </span> <p class="content">UML 2 把结构图看成一个分c;q里q不存在UCؓ“结构图”的图。然而,cd提供l构囄型的一个主要实例,qؓ我们提供一l记号元素的初始集,供所有其它结构图使用。由于类图是如此基本Q本文的剩余部分会把重炚w中在cd记号集。在本文的结,你将对于如何画UML 2cd有所了解Q而且对于理解在后面文章中涉及的其他l构图有一个稳固的基础?/p> <p class="content"><a name="IDATTMUB">基础</a><br>如先前所提到的,cd的目的是昄建模pȝ的类型。在大多数的 UML 模型中这些类型包括:</p> <ul xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><li id="wmqeeuq" class="content">c?br><br> </li><li id="wmqeeuq" class="content">接口<br><br> </li><li id="wmqeeuq" class="content">数据cd<br><br> </li><li id="wmqeeuq" class="content">lg </li></ul> <p class="content">UML 些类型v了一个特别的名字Q“分cd”。通常圎ͼ你可以把分类器当做类Q但在技术上Q分cd是更为普遍的术语Q它q是引用上面的其它三U类型ؓ好?/p> <p class="content"><b xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">cd</b></p> <p class="content">cȝ UML 表示是一个长方ŞQ垂直地分ؓ三个区,如图 1 所C。顶部区域显C类的名字。中间的区域列出cȝ属性。底部的区域列出cȝ操作。当在一个类图上M个类元素Ӟ你必要有顶端的区域Q下面的二个区域是可选择的(当图描述仅仅用于昄分类器间关系的高层细节时Q下面的两个区域是不必要的)。图 1 昄一个航U班机如何作?UML cd模。正如我们所能见到的Q名字是 <i xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">Flight</i>Q我们可以在中间区域看到Flightcȝ3个属性:flightNumberQdepartureTime ?flightDuration。在底部区域中我们可以看到FlightcL两个操作QdelayFlight ?getArrivalTime?/p><span id="wmqeeuq" class="content"><img alt="?1: Flightcȝcd" src="http://www.uml.org.cn/oobject/images/bell_fig1.jpg" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" border="0" height="128" width="288"> </span> <p class="content"><b xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">?1: Flightcȝcd</b></p> <p class="content"> </p> <p class="content"><b xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">cd性列?/b></p> <p class="content">cȝ属性节Q中部区域)在分隔线上列出每一个类的属性。属性节是可选择的,要是一用它Q就包含cȝ列表昄的每个属性。该U用如下格式Q?/p> <blockquote xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <table bgcolor="#cccccc" border="1" cellpadding="5" cellspacing="0" width="400"> <tbody> <tr> <td><pre class="content"><code>name : attribute type</code></pre></td></tr></tbody></table></blockquote> <blockquote xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <table bgcolor="#cccccc" border="1" cellpadding="5" cellspacing="0" width="400"> <tbody> <tr> <td><pre class="content"><code>flightNumber : Integer</code></pre></td></tr></tbody></table></blockquote> <p class="content">l箋我们的Flightcȝ例子Q我们可以用属性类型信息来描述cȝ属性,如表 1 所C?/p> <p class="content"><b xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">? 1Q具有关联类型的Flightcȝ属性名?/b></p> <table border="0" width="100%"> <tbody> <tr> <td bgcolor="#000000"> <table border="0" width="100%"> <tbody> <tr bgcolor="#cccccc"> <td class="content">属性名U?/td> <td class="content">属性类?/td></tr> <tr bgcolor="#ffff99"> <td class="content">flightNumber</td> <td class="content">Integer</td></tr> <tr bgcolor="#ffff99"> <td class="content">departureTime</td> <td class="content">Date</td></tr> <tr bgcolor="#ffff99"> <td class="content">flightDuration</td> <td class="content">Minutes</td></tr></tbody></table></td></tr></tbody></table> <p class="content">在业务类图中Q属性类型通常与单位相W,q对于图的可能读者是有意义的Q例如,分钟Q美元,{等Q。然而,用于生成代码的类图,要求cȝ属性类型必限制在q序语a提供的类型之中,或包含于在系l中实现的、模型的cd之中?/p> <p class="content">在类图上昄h默认值的特定属性,有时是有用的Q例如,在银行̎户应用程序中Q一个新的银行̎户会以零为初始|。UML 规范允许在属性列表节中,通过使用如下的记号作为默认值的标识Q?/p> <blockquote xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <table bgcolor="#cccccc" border="1" cellpadding="5" cellspacing="0" width="400"> <tbody> <tr> <td><pre class="content"><code>name : attribute type = default value</code></pre></td></tr></tbody></table></blockquote> <p class="content">举例来说Q?/p> <blockquote xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <table bgcolor="#cccccc" border="1" cellpadding="5" cellspacing="0" width="400"> <tbody> <tr> <td><pre class="content"><code>balance : Dollars = 0</code></pre></td></tr></tbody></table></blockquote> <p class="content">昄属性默认值是可选择的;?2 昄一个银行̎Lh一个名?<i xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">balance</i>的类型,它的默认gؓ0?/p><span id="wmqeeuq" class="content"><img alt="?2Q显C默认ؓ0元的balance属性值的银行账户cd? src="http://www.uml.org.cn/oobject/images/bell_fig2.jpg" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" border="0" height="113" width="212"> </span> <p class="content"><b xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">? 2Q显C默认ؓ0元的balance属性值的银行账户cd?/b></p> <p class="content"> </p> <p class="content"><b xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">cL作列?/b></p> <p class="content">cL作记录在cd长方形的W三个(最低的Q区域中Q它也是可选择的。和属性一Pcȝ操作以列表格式显C,每个操作在它自己U上。操作用下列记可玎ͼ</p> <blockquote xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <table bgcolor="#cccccc" border="1" cellpadding="5" cellspacing="0" width="400"> <tbody> <tr> <td><pre class="content"><code> name(parameter list) : type of value returned</code></pre></td></tr></tbody></table></blockquote> <p class="content">下面的表 2 中FlightcL作的映射?/p> <p class="content"><b xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">?2Q从? 2 映射的Flightcȝ操作</b></p> <table border="0" width="100%"> <tbody> <tr> <td bgcolor="#000000"> <table border="0" width="100%"> <tbody> <tr align="left" bgcolor="#cccccc" valign="top"> <td class="content"><b xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">操作名称</b></td> <td class="content"><b xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">q回参数</b></td> <td class="content"><b xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">值类?/b></td></tr> <tr align="left" bgcolor="#ffff99" valign="top"> <td class="content">delayFlight</td> <td> <table border="0" cellpadding="5" cellspacing="2" width="100%"> <tbody> <tr> <td class="content"><b xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">Name</b></td> <td class="content"><b xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">Type</b></td></tr> <tr> <td class="content">numberOfMinutes</td> <td class="content">Minutes</td></tr></tbody></table></td> <td class="content">N/A</td></tr> <tr align="left" bgcolor="#ffff99" valign="top"> <td class="content">getArrivalTime</td> <td class="content">N/A</td> <td class="content">Date</td></tr></tbody></table></td></tr></tbody></table> <p class="content">?昄QdelayFlight 操作有一个Minutescd的输入参?-- numberOfMinutes。然而,delayFlight 操作没有q回倹{?a xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><sup>1</sup></a> 当一个操作有参数Ӟ参数被放在操作的括号内;每个参数都用这L格式Q“参数名Q参数类型”?/p><span id="wmqeeuq" class="content"><img alt="?3QFlightcL作参敎ͼ包括可选择的“in”标识? src="http://www.uml.org.cn/oobject/images/bell_fig3.jpg" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" border="0" height="129" width="279"> </span> <p class="content"><b xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">? 3QFlightcL作参敎ͼ包括可选择的“in”标识?/b></p> <p class="content"> </p> <p class="content">当文档化操作参数Ӟ你可能用一个可选择的指C器Q以昄参数到操作的输入参数、或输出参数。这个可选择的指C器以“in”或“out”出玎ͼ如图3中的操作区域所C。一般来_除非用一U早期的E序~程语言Q如Fortran Q这些指C器可能会有所帮助Q否则它们是不必要的。然而,? C++和Java中,所有的参数是“in”参敎ͼ而且按照UML规范Q既然“in”是参数的默认类型,大多Ch会遗漏输入/输出指示器?/p> <p class="content"><b xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">l承</b></p> <p class="content">在面向对象的设计中一个非帔R要的概念Q?i xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">l承</i>Q指的是一个类Q子c)<i xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">l承</i>另外的一个类Q超c)的同一功能Qƈ增加它自q新功能(一个非技术性的比喻Q想象我l承了我母亲的一般的音乐能力Q但是在我的安Q我是唯一一个玩电吉他的人)的能力。ؓ了在一个类图上建模l承Q从子类Q要l承行ؓ的类Q拉Z条闭合的Q单键头Q或三角形)的实U指向超cR考虑银行账户的类型:? 4 昄 CheckingAccount ?SavingsAccount cd何从 BankAccount cȝ承而来?/p><span id="wmqeeuq" class="content"><img alt="?4: l承通过指向类的一条闭合的Q单头的实U表C? src="http://www.uml.org.cn/oobject/images/bell_fig4.jpg" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" border="0" height="335" width="563"> </span> <p class="content"><b xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">?4: l承通过指向类的一条闭合的Q单头的实U表C?/b></p> <p class="content"> </p> <p class="content">在图 4 中,l承关系由每个超cȝ单独的线dQ这是在IBM Rational Rose和IBM Rational XDE中用的Ҏ。然而,有一U称?<i xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">树标?/i>的备选方法可以画出承关pR当存在两个或更多子cLQ如? 4 中所C,除了l承U象树枝一h؜在一起外Q你可以使用树Ş记号。图 5 是重l的与图 4 一Ll承Q但是这ơ用了树Ş记号?/p><span id="wmqeeuq" class="content"><img alt="?5: 一个用树形记Ll承实例" src="http://www.uml.org.cn/oobject/images/bell_fig5.jpg" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" border="0" height="335" width="563"> </span> <p class="content"><b xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">?5: 一个用树形记Ll承实例</b></p> <p class="content"> </p> <p class="content"><b xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">抽象cd操作</b><br xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">l心的读者会注意刎ͼ在图 4 ?? 中的图中,cdBankAccount和withdrawal操作使用斜体。这表示QBankAccount cL一个抽象类Q而withdrawalҎ是抽象的操作。换句话_BankAccount cM用withdrawal规定抽象操作Qƈ且CheckingAccount ?SavingsAccount 两个子类都分别地执行它们各自版本的操作?/p> <p class="content">然而,类Q父c)不一定要是抽象类。标准类作ؓ类是正常的?/p> <p class="content"><b xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">兌</b><br xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">当你pȝ建模Ӟ特定的对象间会彼此兌Q而且q些兌本n需要被清晰地徏模。有五种兌。在q一部分中,我将会讨论它们中的两? -- 双向的关联和单向的关联,而且我将会在<i xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">Beyond the basics</i>部分讨论剩下的三U关联类型。请注意Q关于何时该使用每种cd兌的详l讨论,不属于本文的范围。相反的Q我会把重炚w中在每种兌的用途,q说明如何在cd上画出关联?/p> <p class="content"><b xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">双向Q标准)的关?/b><br xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">兌是两个类间的联接。关联L被假定是双向的;q意味着Q两个类彼此知道它们间的联系Q除非你限定一些其它类型的兌。回一下Flight 的例子,?6 昄了在FlightcdPlanecM间的一个标准类型的兌?/p><span id="wmqeeuq" class="content"><img alt="?6Q在一个FlightcdPlanecM间的双向兌的实? src="http://www.uml.org.cn/oobject/images/bell_fig6.jpg" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" border="0" height="172" width="680"> </span> <p class="content"><b xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">? 6Q在一个FlightcdPlanecM间的双向兌的实?/b></p> <p class="content"> </p> <p class="content">一个双向关联用两个c间的实U表C。在U的M端,你放|一个角色名和多重倹{图 6 昄Flight与一个特定的Plane相关联,而且Flightcȝ道这个关联。因色名以Planec表C,所以Plane承担兌中的“assignedPlane”角艌Ӏ紧接于Planecd面的多重值描q?...1表示Q当一个Flight实体存在Ӟ可以有一个或没有Plane与之兌Q也是QPlane可能q没有被分配Q。图 6 也显CPlane知道它与Flightcȝ兌。在q个兌中,Flight承担“assignedFlights”角Ԍ?6 的图告诉我们QPlane实体可以不与flight兌Q例如,它是一架全新的飞机Q或与没有上限的flightQ例如,一架已l服?q的飞机Q关联?/p> <p class="content">׃寚w些在兌N可能出现的多重值描q感到疑惑,下面的表3列出了一些多重值及它们含义的例子?/p> <p class="content"><b xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">?3: 多重值和它们的表C?/b></p> <table border="0"> <tbody> <tr> <td bgcolor="#000000"> <table border="0" cellpadding="5" cellspacing="2" width="100%"> <tbody> <tr bgcolor="#cccccc"> <td class="content" colspan="2">可能的多重值描q?/td></tr> <tr bgcolor="#ffff99"> <td class="content">表示</td> <td class="content">含义</td></tr> <tr bgcolor="#ffff99"> <td class="content">0..1</td> <td class="content">0个或1?/td></tr> <tr bgcolor="#cccccc"> <td class="content">1</td> <td class="content">只能1?/td></tr> <tr bgcolor="#cccccc"> <td class="content">0..*</td> <td class="content">0个或多个</td></tr> <tr bgcolor="#cccccc"> <td class="content">*</td> <td class="content">0个或多个</td></tr> <tr bgcolor="#cccccc"> <td class="content">1..*</td> <td class="content">1个或我个</td></tr> <tr bgcolor="#cccccc"> <td class="content">3</td> <td class="content">只能3?/td></tr> <tr bgcolor="#cccccc"> <td class="content">0..5</td> <td class="content">0??/td></tr> <tr bgcolor="#cccccc"> <td class="content">5..15</td> <td class="content">5?5?/td></tr></tbody></table></td></tr></tbody></table> <p class="content"><b xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">单向兌</b><br xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">在一个单向关联中Q两个类是相关的Q但是只有一个类知道q种联系的存在。图 7 昄单向兌的透支财务报告的一个实例?/p><span id="wmqeeuq" class="content"><img alt="?7: 单向兌一个实例:OverdrawnAccountsReport c?BankAccount c,?BankAccount cd对关联一无所知? src="http://www.uml.org.cn/oobject/images/bell_fig7.jpg" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" border="0" height="113" width="600"> </span> <p class="content"><b xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">?7: 单向兌一个实例:OverdrawnAccountsReport c?BankAccount c,?BankAccount cd对关联一无所知?/b></p> <p class="content"> </p> <p class="content">一个单向的兌Q表CZؓ一条带有指向已知类的开攄_不关闭的头或三角ŞQ用于标志承)的实Uѝ如同标准关联,单向兌包括一个角色名和一个多重值描qͼ但是与标准的双向兌不同的时Q单向关联只包含已知cȝ角色名和多重值描q。在? 7 中的例子中,OverdrawnAccountsReport 知道 BankAccount c,而且知道 BankAccount cL演“overdrawnAccounts”的角色。然而,和标准关联不同,BankAccount cdƈ不知道它?OverdrawnAccountsReport 相关联?a xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><sup>2</sup></a></p> <p class="content"><b xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">软g?/b><br xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">不可避免Q如果你正在Z个大的系l或大的业务领域建模Q在你的模型中将会有许多不同的分cd。管理所有的cd是一件o人生畏的dQ所以,UML 提供一个称?<i xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">软g?/i>的组l元素。Y件包使徏模者能够组l模型分cd到名字空间中Q这有些象文件系l中的文件夹。把一个系l分为多个Y件包使系l变成容易理解,其是在每个软g包都表现pȝ的一个特定部分时?a xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><sup>3</sup></a></p> <p class="content">在图中存在两U方法表CY件包。ƈ没有规则要求使用哪种标记Q除了用你个人的判断Q哪U更便于阅读你画的类图。两U方法都是由一个较的长方形(用于定位Q嵌套在一个大的长方Ş中开始的Q如? 8 所C。但是徏模者必d定包的成员如何表C,如下Q?/p> <ul xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><li id="wmqeeuq" class="content">如果建模者决定在大长方Ş中显CY件包的成员,则所有的那些成员<a ><sup>4</sup></a> 需要被攄在长方Ş里面。另外,所有Y件包的名字需要放在Y件包的较长方Ş之内Q如?8 的显C)?br><br> </li><li id="wmqeeuq" class="content">如果建模者决定在大的长方形之外显CY件包成员Q则所有将会在图上昄的成员都需要被|于长方形之外。ؓ了显C属于Y件包的分cd属于Q从每个分类器画一条线到里面有加号的圆周,q些圆周_附在Y件包之上Q图9Q? </li></ul><span id="wmqeeuq" class="content"><img alt="?8Q在软g包的长方形内昄软g包成员的软g包元素例? src="http://www.uml.org.cn/oobject/images/bell_fig8.jpg" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" border="0" height="410" width="576"> </span> <p class="content"><b xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">? 8Q在软g包的长方形内昄软g包成员的软g包元素例?/b></p> <p class="content"> </p><span id="wmqeeuq" class="content"><img alt="?9Q一个通过q接U表现Y件包成员的Y件包例子" src="http://www.uml.org.cn/oobject/images/bell_fig9.jpg" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" border="0" height="622" width="551"> </span> <p class="content"><b xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">? 9Q一个通过q接U表现Y件包成员的Y件包例子</b></p> <p class="content"> </p> <p class="content"><b xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">了解基础重要?/b></p> <p class="content">?UML 2 中,了解cd的基更ؓ重要。这是因为类图ؓ所有的其他l构图提供基本的构徏块。如lg或对象图Q仅仅是举了些例子)?/p> <p class="content"><a name="IDAQ4RUB">过基础</a><br>到此为止Q我已经介绍了类囄基础Q但是请l箋往下读Q在下面的部分中Q我会引导你到你会使用的类囄更重要的斚w。这些包括UML 2 规范中的接口Q其它的三种兌cdQ可见性和其他补充?/p> <p class="content"><b xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">接口</b><br xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">在本文的前面Q我你以cL考虑<i xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">分类?/i>。事实上Q分cd是一个更Z般的概念Q它包括数据cd和接口?/p> <p class="content">关于何时、以及如何高效地在系l结构图中用数据类型和接口的完整讨论,不在本文的讨围之内。既然这P我ؓ什么要在这里提及数据类型和接口呢?你可能想在结构图上模仿这些分cdcdQ在q个时候,使用正确的记h表示Q或者至知道这些分cdcd是重要的。不正确地绘制这些分cdQ很有可能将使你的结构图读者感到؜乱,以后的系l将不能适应需求?/p> <p class="content">一个类和一个接口不同:一个类可以有它形态的真实实例Q然而一个接口必至有一个类来实现它。在 UML 2 中,一个接口被认ؓ是类建模元素的特D化。因此,接口pc那LӞ但是长方形的剙区域也有文本“interface”,如图 10 所C?a xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><sup>5</sup></a></p><span id="wmqeeuq" class="content"><img alt="?10QProfessorcdStudentcd现Person接口的类囑֮? src="http://www.uml.org.cn/oobject/images/bell_fig10.gif" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" border="0" height="262" width="325"> </span> <p class="content"><b xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">? 10QProfessorcdStudentcd现Person接口的类囑֮?/b></p> <p class="content"> </p> <p class="content">在图 10 中显C的图中QProfessor和Studentc都实现了Person的接口,但ƈ不从它ѝ我们知道这一Ҏ׃下面两个原因Q?) Person对象作ؓ接口被定?-- 它在对象的名字区域中有“interface”文本,而且我们看到׃Professor和Student对象Ҏȝ对象的规则(在它们的名字区域中没有额外的分类器文本)标示Q所以它们是 <i xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">c?/i>对象?2) 我们知道l承在这里没有被昄Q因Z带箭头的U是点线而不是实Uѝ如?10 所C,一条带有闭合的单向头?i xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">?/i> U意味着实现Q或实施Q;正如我们在图 4 中所见到的,一条带有闭合单向箭头的<i xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">?/i>U表Cѝ?/p> <p class="content"><b xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">更多的关?/b><br xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">在上面,我讨Z双向兌和单向关联。现在,我将会介l剩下的三种cd的关联?/p> <p class="content"><b xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">兌c?/b><br xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">在关联徏模中Q存在一些情况下Q你需要包括其它类Q因为它包含了关于关联的有h值的信息。对于这U情况,你会使用 <i xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">兌c?/i> 来绑定你的基本关联。关联类和一般类一栯C。不同的是,ȝ和关联类之间用一条相交的点线q接。图 11 昄一个航I工业实例的兌cR?/p><span id="wmqeeuq" class="content"><img alt="?11Q增加关联类 MileageCredit" src="http://www.uml.org.cn/oobject/images/bell_fig11.jpg" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" border="0" height="235" width="731"> </span> <p class="content"><b xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">? 11Q增加关联类 MileageCredit</b></p> <p class="content"> </p> <p class="content">在图 11 中显C的cd中,在Flightcd FrequentFlyer cM间的兌Q生了UCؓ MileageCredit的关联类。这意味当Flightcȝ一个实例关联到 FrequentFlyer cȝ一个实例时Q将会?MileageCredit cȝ一个实例?/p> <p class="content"><b xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">聚合</b><br xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">聚合是一U特别类型的兌Q用于描q“M到局部”的关系。在基本的聚合关pMQ? <i xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">部分c?/i> 的生命周期独立于 <i xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">整体c?/i> 的生命周期?/p> <p class="content">举例来说Q我们可以想象,<i xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">?/i> 是一个整体实体,?<i xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">车轮</i> 轮胎是整辆R的一部分。轮胎可以在安置到R时的前几个星期被刉,q放|于仓库中。在q个实例中,Wheelcd例清楚地独立地Carcd例而存在。然而,有些情况下, <i xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">部分</i> cȝ生命周期q?<i xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">?/i> 独立?<i xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">整体</i> cȝ生命周期 -- q称为合成聚合。D例来_考虑公司与部门的关系?<i xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">公司和部?/i> 都徏模成c,在公司存在之前,部门不能存在。这里Departmentcȝ实例依赖于Companycȝ实例而存在?/p> <p class="content">让我们更q一步探讨基本聚合和l合聚合?/p> <p class="content"><b xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><i>基本聚合</i></b><br xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">有聚合关pȝ兌指出Q某个类是另外某个类的一部分。在一个聚合关pMQ子cd例可以比父类存在更长的时间。ؓ了表C个聚合关p,你画一条从父类到部分类的实U,q在父类的关联末端画一个未填充Ş。图 12 昄车和轮胎间的聚合关系的例子?/p><span id="wmqeeuq" class="content"><img alt="?12: 一个聚合关联的例子" src="http://www.uml.org.cn/oobject/images/bell_fig12.jpg" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" border="0" height="49" width="291"> </span> <p class="content"><b xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">?12: 一个聚合关联的例子</b></p> <p class="content"> </p> <p class="content"><b xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><i>l合聚合</i></b><br xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">l合聚合关系是聚合关pȝ另一UŞ式,但是子类实例的生命周期依赖于父类实例的生命周期。在?3中,昄了CompanycdDepartmentcM间的l合关系Q注意组合关pd聚合关系一LӞ不过q次菱Ş是被填充的?/p><span id="wmqeeuq" class="content"><img alt="?13: 一个组合关pȝ例子" src="http://www.uml.org.cn/oobject/images/bell_fig13.jpg" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" border="0" height="47" width="341"> </span> <p class="content"><b xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">?13: 一个组合关pȝ例子</b></p> <p class="content"> </p> <p class="content">在图 13 中的关系建模中,一个Companycd例至L一个Departmentcd例。因为关pLl合关系Q当Company实例被移?销毁时QDepartment实例也将自动地被U除/销毁。组合聚合的另一个重要功能是部分cd能与父类的实例相养I举例来说Q我们例子中的Companyc)?/p> <p class="content"><b xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">反射兌</b><br xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">现在我们已经讨论了所有的兌cd。就如你可能注意到的Q我们的所有例子已l显CZ两个不同cM间的关系。然而,cM可以使用反射兌与它本n相关联。v先,q可能没有意义,但是CQ类是抽象的。图 14 昄一个Employeecd何通过manager / manages角色与它本n相关。当一个类兌到它本nӞqƈ不意味着cȝ实例与它本n相关Q而是cȝ一个实例与cȝ另一个实例相兟?/p><span id="wmqeeuq" class="content"><img alt="?14Q一个反关联关pȝ实例" src="http://www.uml.org.cn/oobject/images/bell_fig14.gif" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" border="0" height="114" width="193"> </span> <p class="content"><b xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">? 14Q一个反关联关pȝ实例</b></p> <p class="content"> </p> <p class="content">?14 描绘的关p说明一个Employee实例可能是另外一个Employee实例的经理。然而,因ؓ“manages”的关系角色? 0..*的多重性描qͼ一个雇员可能不受Q何其他雇员管理?/p> <p class="content"><b xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">可见?/b><br xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">在面向对象的设计中,存在属性及操作可见性的记号。UML 识别四种cd的可见性:publicQprotectedQprivate及package?/p> <p class="content">UML 规范q不要求属性及操作可见性必LC在cd上,但是它要求ؓ每个属性及操作定义可见性。ؓ了在cd上的昄可见性,攄可见性标志于属性或操作的名字之前。虽?UML 指定四种可见性类型,但是实际的编E语a可能增加额外的可见性,或不支持 UML 定义的可见性。表4昄?UML 支持的可见性类型的不同标志?/p> <p class="content"><b xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">? 4QUML 支持的可见性类型的标志</b></p> <table border="0" width="100%"> <tbody> <tr> <td bgcolor="#000000"> <table border="0" width="100%"> <tbody> <tr bgcolor="#cccccc"> <td class="content">标志</td> <td class="content">可见性类?/td></tr> <tr bgcolor="#ffff99"> <td class="content">+</td> <td class="content">Public</td></tr> <tr bgcolor="#ffff99"> <td class="content">#</td> <td class="content">Protected</td></tr> <tr bgcolor="#ffff99"> <td class="content">-</td> <td class="content">Private</td></tr> <tr bgcolor="#ffff99"> <td class="content">~</td> <td class="content">Package</td></tr></tbody></table></td></tr></tbody></table> <p class="content">现在Q让我们看一个类Q以说明属性及操作的可见性类型。在?15 中,所有的属性及操作都是publicQ除? updateBalance 操作。updateBalance 操作是protected?/p><span id="wmqeeuq" class="content"><img alt="?15Q一?BankAccount c说明它的属性及操作的可见? src="http://www.uml.org.cn/oobject/images/bell_fig15.jpg" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" border="0" height="129" width="276"> </span> <p class="content"><b xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">? 15Q一?BankAccount c说明它的属性及操作的可见?/b></p> <p class="content"> </p> <p class="content"><a name="IDA2DSUB">UML 2 补充</a><br>既然我们已经覆盖了基和高U主题,我们覆盖一些由UML 1. x增加的类囄新记受?/p> <p class="content"><b xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">实例</b><br xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">当一个系l结构徏模时Q显CZ子类实例有时候是有用的。ؓ了这U结构徏模,UML 2 提供 <i xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">实例规范</i> 元素Q它昄在系l中使用例子Q或现实Q实例的值得注意的信息?/p> <p class="content">实例的记号和cMP但是取代端区域中仅有的cdQ它的名字是l过拼接?</p> <blockquote xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <table bgcolor="#cccccc" border="1" cellpadding="5" cellspacing="0" width="400"> <tbody> <tr> <td><pre class="content"><code>Instance Name : Class Name</code></pre></td></tr></tbody></table></blockquote> <p class="content">举例来说Q?/p> <blockquote xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <table bgcolor="#cccccc" border="1" cellpadding="5" cellspacing="0" width="400"> <tbody> <tr> <td><pre class="content"><code>Donald : Person</code></pre></td></tr></tbody></table></blockquote> <p class="content">因ؓ昄实例的目的是昄值得注意的或相关的信息,没必要在你的模型中包含整个实体属性及操作。相反地Q仅仅显C感兴趣的属性及其值是完全恰当的。如?6所描述?/p><span id="wmqeeuq" class="content"><img alt="?16QPlanecȝ一个实例例子(只显C感兴趣的属性|" src="http://www.uml.org.cn/oobject/images/bell_fig16.jpg" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" border="0" height="90" width="176"> </span> <p class="content"><b xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">? 16QPlanecȝ一个实例例子(只显C感兴趣的属性|</b></p> <p class="content"> </p> <p class="content">然而,仅仅表现一些实例而没有它们的关系不太实用Q因此,UML 2 也允许在实体层的关系/兌建模。绘制关联与一般的cdpȝ规则一P除了在徏模关联时有一个附加的要求。附加的限制是,兌关系必须与类囄关系怸_而且兌的角色名字也必须与类囄一致。它的一个例子显CZ? 17 中。在q个例子中,实例是图 6 中类囄例子实例?/p><span id="wmqeeuq" class="content"><img alt="?17Q图 6 中用实例代替cȝ例子" src="http://www.uml.org.cn/oobject/images/bell_fig17.jpg" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" border="0" height="247" width="576"> </span> <p class="content"><b xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">?17Q图 6 中用实例代替cȝ例子</b></p> <p class="content"> </p> <p class="content">?17 有Flightcȝ二个实例Q因为类图指Z在PlanecdFlightcM间的关系?<i xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">0或多</i>。因此,我们的例子给Z两个与NX0337 Plane实例相关的Flight实例?/p> <p class="content"><b xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">角色</b><br xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">建模cȝ实例有时比期望的更ؓ详细。有Ӟ你可能仅仅想要在一个较多的一般层ơ做cdpȝ模型。在q种情况下,你应该? <i xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">角色</i> 记号。角色记Lg实例记号。ؓ了徏立类的角色模型,你画一个方|q在内部攄cȝ角色名及cdQ作为实体记P但是在这情况你不能加下划Uѝ图 18 昄一个由? 14 中图描述的雇员类扮演的角色实例。在?18 中,我们可以认ؓQ即佉K员类与它本n相关Q关pȝ实是关于雇员之间扮演l理及团队成员的角色?/p><span id="wmqeeuq" class="content"><img alt="?18Q一个类图显C图14中扮演不同角色的c? src="http://www.uml.org.cn/oobject/images/bell_fig18.gif" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" border="0" height="73" width="506"> </span> <p class="content"><b xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">? 18Q一个类图显C图14中扮演不同角色的c?/b></p> <p class="content">注意Q你不能在纯_类图中做类角色的徏模,即? 18昄你可以这么做。ؓ了用角色记P你将会需要用下面讨论的内部l构记号?/p> <p class="content"><b xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">内部的结?/b><br xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">UML 2 l构囄更有用的功能之一是新的内部结构记受它允许你显CZ个类或另外的一个分cd如何在内部构成。这?UML 1. x 中是不可能的Q因号限制你只能昄一个类所拥有的聚合关pR现在,?UML 2 中,内部的结构记可你更清楚地显C类的各个部分如何保持关pR?/p> <p class="content">让我们看一个实例。在?18 中我们有一个类图以表现一个Planecd何由四个引擎和两个控制Y件对象组成。从q个图中省略的东西是昄关于飞机部g如何被装配的一些信息。从?18 的图Q你无法说明Q是每个控制软g对象控制两个引擎Q还是一个控制Y件对象控制三个引擎,而另一个控制一个引擎?/p><span id="wmqeeuq" class="content"><img alt="?19: 只显C对象之间关pȝcd" src="http://www.uml.org.cn/oobject/images/bell_fig19.gif" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" border="0" height="197" width="415"> </span> <p class="content"><b xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">?19: 只显C对象之间关pȝcd</b></p> <p class="content"> </p> <p class="content">l制cȝ内在l构会改善q种状态。开始时Q你通过用二个区域画一个方根{最端的区域包含类名字Q而较低的区域包含cȝ内部l构Q显C在它们父类中承担不同角色的部分c,角色中的每个部分cM关系到其它类。图 19 昄了Planecȝ内部l构Q注意内部结构如何澄清؜乱性?/p><span id="wmqeeuq" class="content"><img alt="?20QPlanecȝ内部l构例子? src="http://www.uml.org.cn/oobject/images/bell_fig20.gif" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" border="0" height="277" width="579"> </span> <p class="content"><b xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">? 20QPlanecȝ内部l构例子?/b></p> <p class="content"> </p> <p class="content">在图 20 中Plane有两?ControlSoftware 对象Q而且每个控制二个引擎。在囑ַ边上? ControlSoftwareQcontrol1Q控制引?1 ?2 。在囑֏边的 ControlSoftwareQcontrol2Q控制引?3 ?4 ?/p> <p class="content"><a name="IDAWGSUB">l论</a><br>臛_存在两个了解cd的重要理由。第一个是它显C系l分cd的静态结构;W二个理由是图ؓUML描述的其他结构图提供了基本记受开发者将会认为类图是Z们特别徏立的Q但是其他的团队成员发现它们也是有用的。业务分析师可以用类图,为系l的业务q景建模。正如我们将会在本系列关? UML 基础的文章中见到的,其他的图 -- 包括zd图,序列囑֒状态图——参考类图中的类建模和文档化?/p> <p class="content">关于“UML 基础”的本系列的后面的元件图?/p><span id="wmqeeuq" class="content"><a name="notes" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"></a></span> <p class="content"><a name="IDABHSUB">脚注</a><br><sup xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">1</sup> delayFlight没有q回|因ؓ我作Z设计军_Q不要返回倹{有一点可以争论的是,延迟操作应该q回新的到达旉Q而且Q如果是q种情ŞQ操作属性将昄? <code>delayFlight(numberOfMinutes : Minutes) : Date?/code></p> <p class="content"><sup xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">2</sup>可能看v来很奇怪, BankAccount cM知道 OverdrawnAccountsReport cR这个徏模报表cd以知道它们报告的业务c,但是业务cM知道它们正在被报告。这解开两个对象的耦合Qƈ因此使系l变得更能适应变化?/p> <p class="content"><sup xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">3</sup> 软g包对于组l你的模型类是庞大的Q但是记住重要的一ҎQ你的类囑ֺ该是关于建模pȝ的容易交的信息。在你的软g包有许多cȝ情况下,最好用多个主题类图,而不是仅仅生一个大的类图?/p> <p class="content"><sup xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">4</sup> 要理解重要一点,当我说“所有的那些成员”时Q我仅仅意味着在当前图中的cd昄出来。显CZ个有内容的Y件包的图Q不需要显C它的所有内宏V它可以依照一些准则,昄包含元素的子集,q个准则是q所有的软g包分cd都是必需的?/p> <p class="content"><sup xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">5</sup> 当画一个类图时Q在 UML 规范中,全部要做的只是把cL入长方Ş的顶部区域,而你同理处理接口Q然而,UML 规范认ؓQ在q个区域攄“class”文本是可选的Q如果类没有昄Q那么它应该被假设?/p> <p class="content"><a name="resources">参考资?/a> </p><ul><li id="wmqeeuq" class="content">您可以参阅本文在 developerWorks 全球站点上的 <a target="_blank" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">英文原文</a>?br></li></ul> <p class="content"> </p> <table border="0" cellpadding="0" cellspacing="0" width="100%"> <tbody> <tr> <td class="content"><a name="author1"></a>关于作?br><img alt="Author photo" src="http://www.uml.org.cn/oobject/images/donaldBell.jpg" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" align="left" height="80" width="64">Donald Bell是IBM全球服务的一个IT专家Q在那儿他和IBM的客户一赯力于设计和开发基于Y件解x案的J2EE?/td></tr></tbody></table> <p> </p></td></tr></tbody></table> </td></tr></tbody></table> <table align="center" border="0" cellpadding="0" cellspacing="0" width="760"> <tbody> <tr> <td align="center"> <hr> <span id="wmqeeuq" class="copyright">版权所有:UML软g工程l织 </span></td></tr></tbody></table><img src ="http://www.aygfsteel.com/jdyao/aggbug/34871.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/jdyao/" target="_blank">襉K村里?/a> 2006-03-11 22:17 <a href="http://www.aygfsteel.com/jdyao/articles/34871.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hibernate对象兌--UML基础知识、XDoclet-----lDhttp://www.aygfsteel.com/jdyao/articles/34864.html襉K村里?/dc:creator>襉K村里?/author>Sat, 11 Mar 2006 13:38:00 GMThttp://www.aygfsteel.com/jdyao/articles/34864.htmlhttp://www.aygfsteel.com/jdyao/comments/34864.htmlhttp://www.aygfsteel.com/jdyao/articles/34864.html#Feedback0http://www.aygfsteel.com/jdyao/comments/commentRss/34864.htmlhttp://www.aygfsteel.com/jdyao/services/trackbacks/34864.html    单的对象操作Q对于Hibernate来说非常单,只需配置属性正就可以工作了,唯一需要注意的是Oracle的CLOB、BLOB操作Q此时你可以通过Spring提供的oracle usertype来轻松搞定?br>    在设计系l的q程中,通常会大量定义对象之间的兌。良好的映射q些关系显得非帔R要?br>    在学习过E中Q只看文档很难促q深入理解这些概늚。最好是实际的实C个较为复杂的兌的例子,下面的例子是Hibernatel的Example基础上,单扩展了一下,供我们学习过E中使用?br>
    cc.PNG

    我们的学习步骤是Q?br>    1、理解OO概念
    2、编写实体类
    3、理解Hibernate兌映射
    4、添加XDoclet标注
    5、生成HbmQ编写JUnit试
    6、测试SetӞinverse、cascating的媄响力
       试ListӞinverse、cascating的媄响力
    7、再读Hibernate官方文档Q深入理解之?br>




]]>
վ֩ģ壺 | ǭ| | | | ʦ| | ҳ| ij| | | | | ͬ| | ɽ| ־| | | ɽ| | ƽɽ| | | ԫ| Դ| | | ǿ| ɽ| ͤ| | ʡ| ͷ| ߮| ʩ| | ŷ| ɫ| | ն|