入門 12 - List 映射

這邊介紹如果物件中包括List型態的屬性時如何進行映射,首先我們假設我們要製作一個線上檔案管理,使用者上載的檔案名稱可能是重複的
、具有相同名稱,之前使用的Set不允許有重複的內容,所以這次我們改用List,我們的User類別撰寫如下:
User.java
package onlyfun.caterpillar;

import java.util.*;

public class User {
    private long id;
    private String name;
    private List files = new ArrayList();
   
    public List getFiles() {
        return files;
    }
    public void setFiles(List files) {
        this.files = files;
    }
   public long getId() {
        return id;
    }
   public void setId(long id) {
        this.id = id;
   }
   public String getName() {
        return name;
   }
   public void setName(String name) {
        this.name = name;
   }
    public void addFiles(String name) {
        files.add(name);
    }
    public void addFiles(int i, String name) {
        files.add(i, name);   
    }
}

 我們在程式中使用的是ArrayList,要在Hibernate中將之映射至資料庫,基本上與映射Set相同,我們使用<list>標籤替代<set>,而由於List中儲存的物件是具有索引值的,所以我們必須額外增加一個欄位來記錄物件在List中的位置,這我們可以使用 <index>標籤來指定,我們的映射文件撰寫如下:

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

<hibernate-mapping>

    <class name="onlyfun.caterpillar.User" table="USER">

        <id name="id" type="long" unsaved-value="null">
            <column name="USER_ID"/>
            <generator class="increment"/>
        </id>

        <property name="name" type="string" not-null="true">
            <column name="NAME" length="16" not-null="true"/>
        </property>
       
        <list name="files" table="FILES">
            <key column="USER_ID"/>
            <index column="POSITION"/>
            <element type="string" column="FILENAME" not-null="true"/>
        </list>
    </class>

</hibernate-mapping>

 與Set類似的是,記錄List的FILES表格中,使用與USER表格相同的USER_ID值,我們來看看資料儲存至資料表中是如何,假設我們的程式以下面的方式儲存資料:

User user1 = new User();
        user1.setName("caterpillar");
        user1.addFiles("hibernate2.jar");
        user1.addFiles("jtx.jar");
       
        User user2 = new User();
        user2.setName("momor");
        user2.addFiles("fan.jpg");
        user2.addFiles("fan.jpg");
        user2.addFiles("bush.jpg");
       
        Session session = sessionFactory.openSession();
        Transaction tx= session.beginTransaction();
        session.save(user1);
        session.save(user2);
        tx.commit();
        session.close();

 那麼在資料庫中的USER與FILES表格將儲存以下的內容:

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

mysql> select * from files;
+---------+----------------+----------+
| USER_ID | FILENAME       | POSITION |
+---------+----------------+----------+
|       1 | hibernate2.jar |        0 |
|       1 | jtx.jar        |        1 |
|       2 | fan.jpg        |        0 |
|       2 | fan.jpg        |        1 |
|       2 | bush.jpg       |        2 |
+---------+----------------+----------+
5 rows in set (0.00 sec)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值