如果持久化类具有List对象,我们可以通过映射文件中的类的<list>元素或注释来映射List

在这里,我们正在使用论坛的场景,其中一个问题有多个答案。

在这里,我们使用论坛的场景,其中一个问题有多个答案。
集合映射中的映射列表(使用xml文件)
我们来看看如何在映射文件中实现列表(List):

<class name="com.yiibai.Question" table="q100">  
       ...        
          <list name="answers" table="ans100">  
          <key column="qid"></key>  
          <index column="type"></index>  
          <element column="answer" type="string"></element>  
          </list>  

       ...  
</class>
XML

注: List 和 Map是基于索引的集合,因此将在表中创建一个额外的列进行索引。

集合映射中的映射列表(List)示例

在这个例子中,我们将看到列表(List)在集合映射的完整示例。 这是List中存储字符串值而不是实体引用的示例,这就是为什么要在列表元素中使用element标签而不是one-to-many标签的元素。

这个示例项目的完整结构如下图所示 -

集合映射中的映射列表(使用xml文件)

1)创建持久化类

这个持久化类定义了类的属性,包括List

package com.yiibai;

import java.util.List;

public class Question {
    private int id;
    private String qname;
    private List<String> answers;

    public int getId() {
        return id;
    }

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

    public String getQname() {
        return qname;
    }

    public void setQname(String qname) {
        this.qname = qname;
    }

    public List<String> getAnswers() {
        return answers;
    }

    public void setAnswers(List<String> answers) {
        this.answers = answers;
    }

}
Java

2)创建持久化类的映射文件

在这里,我们创建了用于定义列表的question.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="com.yiibai.Question" table="question_100">
        <id name="id">
            <generator class="increment"></generator>
        </id>
        <property name="qname"></property>

        <list name="answers" table="answer_100">
            <key column="qid"></key>
            <index column="type"></index>
            <element column="answer" type="string"></element>
        </list>

    </class>

</hibernate-mapping>
XML

3)创建配置文件

此文件包含有关数据库和映射文件的信息。

文件:hibernate.hnm.xml 内容如下 -

<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
          "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
          "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">

<!-- Generated by MyEclipse Hibernate Tools.                   -->
<hibernate-configuration>

    <session-factory>
        <property name="hbm2ddl.auto">update</property>
        <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="connection.url">jdbc:mysql://localhost:3306/test</property>
        <property name="connection.username">root</property>
        <property name="connection.password">123456</property>
        <property name="dialect">org.hibernate.dialect.MySQL5InnoDBDialect</property>
        <property name="show_sql">true</property>
    <mapping resource="question.hbm.xml"/>
    </session-factory>

</hibernate-configuration>
XML

4)创建存储数据的类

在这个类(MainTest.java)中,用来存储Question类的数据。使用HQL来获取Answer类的所有记录,包括答案。 在这个示例中,它从功能相关的两个表中获取数据。

package com.yiibai;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import org.hibernate.*;
import org.hibernate.boot.MetadataSources;
import org.hibernate.boot.registry.StandardServiceRegistry;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.cfg.*;

public class MainTest {
    public static void main(String[] args) {
        // 但在5.1.0版本汇总,hibernate则采用如下新方式获取:
        // 1. 配置类型安全的准服务注册类,这是当前应用的单例对象,不作修改,所以声明为final
        // 在configure("cfg/hibernate.cfg.xml")方法中,如果不指定资源路径,默认在类路径下寻找名为hibernate.cfg.xml的文件
        final StandardServiceRegistry registry = new StandardServiceRegistryBuilder()
                .configure("hibernate.cfg.xml").build();
        // 2. 根据服务注册类创建一个元数据资源集,同时构建元数据并生成应用一般唯一的的session工厂
        SessionFactory sessionFactory = new MetadataSources(registry)
                .buildMetadata().buildSessionFactory();

        /**** 上面是配置准备,下面开始我们的数据库操作 ******/
        Session session = sessionFactory.openSession();// 从会话工厂获取一个session

        // creating transaction object
        Transaction t = session.beginTransaction();

        ArrayList<String> list1 = new ArrayList<String>();
        list1.add("java is a programming language");
        list1.add("java is a platform");

        ArrayList<String> list2 = new ArrayList<String>();
        list2.add("Servlet is an Interface");
        list2.add("Servlet is an API");

        Question question1 = new Question();
        question1.setQname("Java 是什么?");
        question1.setAnswers(list1);

        Question question2 = new Question();
        question2.setQname("Hibernate 是什么?");
        question2.setAnswers(list2);

        session.persist(question1);
        session.persist(question2);

        t.commit();

        // 查询数据
        Query<Question> query = session.createQuery("from Question");
        List<Question> list = query.list();

        Iterator<Question> itr = list.iterator();
        while (itr.hasNext()) {
            Question q = itr.next();
            System.out.println("Question Name: " + q.getQname

相关文章: