现在的位置: 首页 > 综合 > 正文

Hibernate 学习笔记(4)

2013年09月09日 ⁄ 综合 ⁄ 共 5247字 ⁄ 字号 评论关闭

Hibernate集合映射

<set>,<list>,<map>,<bag>,<array>,<primitive-array>

集合映射-Set

先介绍当Set中包括的对象为非实体(Entity)时的映射方式,简单的说,也就是所包括的对象没有对象识别(Identity),只是纯粹的值型态(Value type)对象)。

假设您有一个User类别,当中除了名称属性之外,另一个就是使用者的电子邮件地址,同一个使用者可能有多个不同的邮件地址,所以在User类别中使用 Set对象来加以记录,在这边使用String来记录每一笔邮件地址,为了不允许重复的邮件地址记录,所以使用Set对象,User类别如下: 

public class User {
    private Integer id;
    private String name;
    private Set emails; 

    // 必须要有一个预设的建构方法
    // 以使得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 Set getEmails() {
        return emails;
    }
    public void setEmails(Set emails) {
        this.emails = emails;
    }
     public void addEmail(String email) {
        this.emails.add(email);
    }
     public void removeEmail(String email) {
        this.emails.remove(email);
    }
}

要映像Set容器,您可以使用另一个表格来储存Set容器中的数据,例如您可以分别建立user与email表格:

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

CREATE TABLE email (
    id INT(11) NOT NULL,
    address VARCHAR(100) NOT NULL
);

接着定义映像文件,使用<set>标签来定义Set映像:

User.hbm.xml 
<hibernate-mapping> 
    <class name=“com.cstp.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"/> 
        <set name="emails" table="email"> 
            <key column="id"/> 
            <element type="java.lang.String" 
                     column="address"/> 
        </set> 
    </class> 
</hibernate-mapping>

假设您如下储存对象:

User user1 = new User();
user1.setEmails(new HashSet());
user1.setName(“hhp");
user1.addEmail(“hhp@gmail.com");
user1.addEmail(“hhp@yahoo.com");
        
User user2 = new User();
user2.setEmails(new HashSet());
user2.setName(“tiantian");
user2.addEmail(“tian@gmail.com");

Session session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();   

         
session.save(user1);
session.save(user2); 


tx.commit();
session.close();

集合映射-List

List是有序的结构,所以在储存List容器中的对象时,要一并储存其顺序信息,例如若您设计了以下的类别: 

User.java 


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 

<hibernate-mapping> 

    <class name=“hhp.com.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(“hhp");
user1.addItem("DC");
user1.addItem("CF Card");
        
User user2 = new User();
user2.setItems(new ArrayList());
user2.setName(“tiantian");
user2.addItem("comics");

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

集合映射-Map

Map的特性是key/value对,容器中的每一个对象都有一个key与之对应,所以将Map容器的数据储存至数据库时,必须一同储存它的key信息。

假设您设计了以下的类别: User.java 

import java.util.Map;

public class User {
    private Integer id;
    private String name;
    private Map 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 Map getItems() {
        return items;
    }

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

    public void addItem(String name, String description) {
        items.put(name, description);
    }
 
    public void removeItem(String name) {
        items.remove(name);
    }
}

您可以建立以下的表格来分别储存user信息与当中的items信息:

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,
    name VARCHAR(100) NOT NULL default '',

抱歉!评论已关闭.