Hibernate入门12 - List 映射

来源:互联网 发布:mac怎么打开身份不明 编辑:程序博客网 时间:2024/05/16 15:28
 
 这边介绍如果对象中包括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)
原创粉丝点击