十一 02

组件(Component)这个概念在Hibernate中几处不同的地方为了不同的目的被重复使用.

8.1. 依赖对象(Dependent objects)
组件(Component)是一个被包含的对象,在持久化的过程中,它被当作值类型,而并非一个实体的引用。在这篇文档中,组件这一术语指的是面向对象的合成概念(而并不是系统构架层次上的组件的概念)。举个例子, 你对人(Person)这个概念可以像下面这样来建模:

public class Person {
   private java.util.Date birthday;
   private Name name;
   private String key;
   public String getKey() {
       return key;
   }
   private void setKey(String key) {
       this.key=key;
   }
   public java.util.Date getBirthday() {
       return birthday;
   }
   public void setBirthday(java.util.Date birthday) {
       this.birthday = birthday;
   }
   public Name getName() {
       return name;
   }
   public void setName(Name name) {
       this.name = name;
   }
   ……
   ……
}
public class Name {
   char initial;
   String first;
   String last;
   public String getFirst() {
       return first;
   }
   void setFirst(String first) {
       this.first = first;
   }
   public String getLast() {
       return last;
   }
   void setLast(String last) {
       this.last = last;
   }
   public char getInitial() {
       return initial;
   }
   void setInitial(char initial) {
       this.initial = initial;
   }
}
在持久化的过程中,姓名(Name)可以作为人(Person)的一个组件。需要注意的是:你应该为姓名的持久化属性定义getter和setter方法,但是你不需要实现任何的接口或申明标识符字段。

以下是这个例子的Hibernate映射文件: 更多详细内容 »

Tags:

作者:Jock

十一 02

7.1. 介绍
关联关系映射通常情况是最难配置正确的。在这个部分中,我们从单向关系映射开始,然后考虑双向关系映射,由浅至深讲述一遍典型的案例。在所有的例子中,我们都使用 Person和Address。

我们根据映射关系是否涉及连接表以及多样性来划分关联类型。

在传统的数据建模中,允许为Null值的外键被认为是一种不好的实践,因此我们所有的例子中都使用不允许为Null的外键。这并不是Hibernate的要求,即使你删除掉不允许为Null的约束,Hibernate映射一样可以工作的很好。

7.2. 单向关联(Unidirectional associations)
7.2.1. 多对一(many to one)
单向many-to-one关联是最常见的单向关联关系。

<class name="Person">
   <id name="id" column="personId">
       <generator class="native"/>
   </id>
   <many-to-one name="address"
       column="addressId"
       not-null="true"/>
</class>

<class name="Address">
   <id name="id" column="addressId">
       <generator class="native"/>
   </id>
</class>
create table Person ( personId bigint not null primary key, addressId bigint not null )
create table Address ( addressId bigint not null primary key )
       
7.2.2. 一对一(one to one)
基于外键关联的单向一对一关联和单向多对一关联几乎是一样的。唯一的不同就是单向一对一关联中的外键字段具有唯一性约束。 更多详细内容 »

Tags:

作者:Jock

十一 02

6.1. 持久化集合类(Persistent collections)
(译者注:在阅读本章的时候,以后整个手册的阅读过程中,我们都会面临一个名词方面的问题,那就是“集合”。"Collections"和"Set"在中文里对应都被翻译为“集合”,但是他们的含义很不一样。Collections是一个超集,Set是其中的一种。大部分情况下,本译稿中泛指的未加英文注明的“集合”,都应当理解为“Collections”。在有些二者同时出现,可能造成混淆的地方,我们用“集合类”来特指“Collecions”,“集合(Set)”来指"Set",一般都会在后面的括号中给出英文。希望大家在阅读时联系上下文理解,不要造成误解。 与此同时,“元素”一词对应的英文“element”,也有两个不同的含义。其一为集合的元素,是内存中的一个变量;另一含义则是XML文档中的一个标签所代表的元素。也请注意区别。 本章中,特别是后半部分是需要反复阅读才能理解清楚的。如果遇到任何疑问,请记住,英文版本的reference是惟一标准的参考资料。)

Hibernate要求持久化集合值字段必须声明为接口,比如:

public class Product {
   private String serialNumber;
   private Set parts = new HashSet();
   
   public Set getParts() { return parts; }
   void setParts(Set parts) { this.parts = parts; }
   public String getSerialNumber() { return serialNumber; }
   void setSerialNumber(String sn) { serialNumber = sn; }
}
实际的接口可能是java.util.Set, java.util.Collection, java.util.List, java.util.Map, java.util.SortedSet, java.util.SortedMap 或者…任何你喜欢的类型!("任何你喜欢的类型" 代表你需要编写 org.hibernate.usertype.UserCollectionType的实现.)

注意我们是如何用一个HashSet实例来初始化实例变量的.这是用于初始化新创建(尚未持久化)的类实例中集合值属性的最佳方法。当你持久化这个实例时——比如通过调用persist()——Hibernate 会自动把HashSet替换为Hibernate自己的Set实现。观察下面的错误: 更多详细内容 »

Tags:

作者:Jock

十一 02

5.1. 映射定义(Mapping declaration)
对象和关系数据库之间的映射通常是用一个XML文档(XML document)来定义的。这个映射文档被设计为易读的, 并且可以手工修改。映射语言是以Java为中心,这意味着映射文档是按照持久化类的定义来创建的, 而非表的定义。

请注意,虽然很多Hibernate用户选择手写XML映射文档,但也有一些工具可以用来生成映射文档, 包括XDoclet,Middlegen和AndroMDA。

让我们从一个映射的例子开始:

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
     "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
         "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping package="eg">

       <class name="Cat"
           table="cats"
           discriminator-value="C">
               
               <id name="id">
                       <generator class="native"/>
               </id>

               <discriminator column="subclass"
                    type="character"/>

               <property name="weight"/>

               <property name="birthdate"
                   type="date"
                   not-null="true"
                   update="false"/>

               <property name="color"
                   type="eg.types.ColorUserType"
                   not-null="true"
                   update="false"/>

               <property name="sex"
                   not-null="true"
                   update="false"/>

               <property name="litterId"
                   column="litterId"
                   update="false"/>

               <many-to-one name="mother"
                   column="mother_id"
                   update="false"/>

               <set name="kittens"
                   inverse="true"
                   order-by="litter_id">
                       <key column="mother_id"/>
                       <one-to-many class="Cat"/>
               </set>

               <subclass name="DomesticCat"
                   discriminator-value="D">

                       <property name="name"
                           type="string"/>

               </subclass>

       </class>

       <class name="Dog">
               <!– mapping for Dog could go here –>
       </class>

</hibernate-mapping>
我们现在开始讨论映射文档的内容。我们只描述Hibernate在运行时用到的文档元素和属性。 映射文档还包括一些额外的可选属性和元素,它们在使用schema导出工具的时候会影响导出的数据库schema结果。 (比如, not-null 属性。) 更多详细内容 »

Tags:

作者:Jock

Switch to our mobile site