3.5.2 使用组件

来源:互联网 发布:大番长数据修改器 编辑:程序博客网 时间:2024/06/08 04:26

迄今为止,我们对象模型中的类都有其自身的生命周期和身份标识。但是,User类和Address类之间有一种特殊的关联关系,在图3.5中你会看到。

在对象模型的术语中,关联是关系的一个集合。集合是一个特定类型的关联:它和对象的生命周期关联。在我们的例子中,我们还包括另外一种强类型:组合,它的生命周期依赖于整个的生命周期。

对象模型专家和UML设计者可能会认为在Java实现上,组合和其他弱类型的关联之间没有什么不同。但是在ORM领域中,区别却很大:一个组合的类型往往是候选的值类型。

我们现在把Address类作为一个值类型,User类作为一个实体。这样做是不是能够影响POJO类的实现呢?

在java中,并没有组合的概念,一个类或者属性并不能标记为组件或者组合。唯一不同的就是对象的标识符。组件并没有身份标识,因此一个持久化的组件并不需要identifier属性或者映射。在User和Address之间的组合属于元数据的级别;我们只需要告诉Hibernate在映射文件中,Address是一个值类型。

在hibernate中,使用术语组件来标识持久化到同一张表的用户自定义类,具体可以参见列表3.7.

<class name=”User” table=”USER”>

<id name=”id” column=”USER_ID” type=”long”>

<generator class=”native”/>

</id>

<property name=”username” column=”USERNAME” type=”string”/>

<component name=”homeAddress” class=”Address”>

<property name=”street” type=”string” column=”HOME_STREET”

notnull=”true”/>

<property name=”city” type=”string” column=”HOME_CITY”

notnull=”true”/>

<property name=”zipcode” type=”short” column=”HOME_ZIPCODE”

notnull=”true”/>

</component>

<component name=”billingAddress” class=”Address”>

<property name=”street” type=”string” column=”BILLING_STREET”

notnull=”true”/>

<property name=”city” type=”string” column=”BILLING_CITY”

notnull=”true”/>

<property name=”zipcode” type=”short” column=”BILLING_ZIPCODE”

notnull=”true”/>

</component>

…..........

</class>

图3.6展示了作为User的实体是如何将Address类的属性持久化到同一张表的。

注意在这个例子中,我们的这种组合关系为单向的。我们不能从Address导向User。Hibernate同时支持单向和双向,然而,单向的组合关系更为普遍。下面是一个双向组合的例子:

<component name=”homeAddress” class=”Address”>

<parent name=”user”/>

<property name=”street” type=”string” column=”HOME_STREET”/>

<property name=”city” type=”string” column=”HOME_CITY”/>

<property name=”zitpcode” type=”short” column=”HOME_ZIPCODE”/>

</component>

<parent>属性映射到了User类型上,这里的名字叫做user。我们可以通过调用Address.getUser()进行导航。

Hibernate可能拥有其他组件或者和其他实体的联系。易用性正是Hibernate支持细粒度的对象模型的基础。

然而,关于类映射成组件有两个局限需要注意:

不能共享引用。组件Address并不拥有数据库标识,除了User对象之外,其他对象并不能引用到Address对象。

并没有一种优雅的方式来表示Address的null值。Hibernate采取的做法是将所有的组件置成null。这就意味着如果所有的属性都是null的话,那么Hibernate将会返回一个null的组件。

细粒度并不仅仅是一个好的业务模型的唯一要素。继承和多态也是面向对象模型的特色。

原创粉丝点击