Dashboard > OpenSource Project > ... > Hibernate 3入門 > List
OpenSource Project Log In   View a printable version of the current page.
List
Added by zach14c, last edited by zach14c on Aug 30, 2005
Labels: 
(None)

關於List的特性,可以先看一下[ArrayList][LinkedList]這兩篇文件。

List是有序的結構,所以在儲存List容器中的物件時,要一併儲存其順序資訊,例如若您設計了以下的類別:

User.java
package onlyfun.caterpillar;

import java.util.List;

public class User {
    private Integer id;
    private String name;
    private List items; 

    // 必須要有一個預設的建構方法
    // 以使得Hibernate可以使用Constructor.newInstance()建立物件
    public User() {
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public List getItems() {
        return items;
    }

    public void setItems(List items) {
        this.items = items;
    }

    public void addItem(String item) {
        items.add(item);
    }
    
    public void removeItem(String item) {
        items.remove(item);
    }
}

在設計表格時,使用一個item表格來記錄List容器資訊,item表格必須包括索引資訊,例如您可以如下建立user與item表格:

CREATE TABLE user (
    id INT(11) NOT NULL auto_increment PRIMARY KEY,
    name VARCHAR(100) NOT NULL default ''
);

CREATE TABLE item (
    id INT(11) NOT NULL,
    position INT(11) NOT NULL,
    name VARCHAR(100) NOT NULL default ''
);

其中position欄位要用來儲存List的索引資訊,可以使用<list>標籤如下定義映射文件:

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

<hibernate-mapping> 

    <class name="onlyfun.caterpillar.User" table="user"> 
        <id name="id" column="id" type="java.lang.Integer"> 
            <generator class="native"/> 
        </id> 
        <property name="name" column="name" type="java.lang.String"/>         
        <list name="items" table="item"> 
            <key column="id"/> 
            <index column="position"/> 
            <element type="java.lang.String" column="name"/> 
        </list> 
    </class> 
</hibernate-mapping>

假設您如下儲存物件:

User user1 = new User();
user1.setItems(new ArrayList());
user1.setName("caterpillar");
user1.addItem("DC");
user1.addItem("CF Card");
        
User user2 = new User();
user2.setItems(new ArrayList());
user2.setName("momor");
user2.addItem("comics");

Session session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();            
session.save(user1);
session.save(user2); 
tx.commit();
session.close();

則資料庫中的儲存狀況如下:

mysql> select * from user;
+----+--------------+
| id | name         |
+----+--------------+
|  1 | caterpillar  |
|  2 | momor        |
+----+--------------+
2 rows in set (0.00 sec)

mysql> select * from item;
+----+------------+-----------+
| id | position   | name      |
+----+------------+-----------+
|  1 |        0   | DC        |
|  1 |        1   | CF Card   |
|  2 |        0   | comics    |
+----+------------+-----------+
3 rows in set (0.00 sec)

Site powered by a free Open Source Project / Non-profit License (more) of Confluence - the Enterprise wiki.
Learn more or evaluate Confluence for your organisation.
Powered by Atlassian Confluence, the Enterprise Wiki. (Version: 2.1.5a Build:#411 Mar 16, 2006) - Bug/feature request - Contact Administrators