如果持久化类具有包含实体引用的列表对象,则需要使用一对多关联来映射列表元素。 我们可以通过列表(list)或包(bag)来映射这个列表对象。

请注意,bag不是基于索引的,而list是基于索引的。

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

通过Bag一对多映射示例(使用xml文件)

下面来看看看具有列表对象的持久化类。 在这种情况下,一个问题可以有多个答案,每个答案可能有自己的信息,这就是为什么这里要使用列表(list)元素(包含答案对象)代表一个答案集合。
Question类代码如下 -

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

Question类有自己的信息,如idanswernamepostedBy等。

package com.yiibai;

public class Answer {
    private int id;
    private String answername;
    private String postedBy;
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getAnswername() {
        return answername;
    }
    public void setAnswername(String answername) {
        this.answername = answername;
    }
    public String getPostedBy() {
        return postedBy;
    }
    public void setPostedBy(String postedBy) {
        this.postedBy = postedBy;
    }

}
Java

Question类具有包含实体引用的列表对象(即Answer类对象)。 在这种情况下,我们需要使用一对多的bag标签来映射此对象。 下面来看看看我们如何映射它。

<bag name="answers" cascade="all">  
    <key column="qid"></key>  
    <one-to-many class="com.yiibai.Answer"/>  
</bag>
XML

通过一对多关联在集合映射中映射包的示例

在这个例子中,我们将看到包含实体引用的映射列表的完整示例。创建一个Java项目:bagonetomany,其完整的目录结构如下 -

通过Bag一对多映射示例(使用xml文件)

1)创建持久化类

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

Question.java 代码如下所示 -

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

Answer.java 代码如下所示 -

package com.yiibai;

public class Answer {
    private int id;
    private String answername;
    private String postedBy;
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getAnswername() {
        return answername;
    }
    public void setAnswername(String answername) {
        this.answername = answername;
    }
    public String getPostedBy() {
        return postedBy;
    }
    public void setPostedBy(String postedBy) {
        this.postedBy = postedBy;
    }

    public String toString(){
        return this.answername+", PostedBy "+this.postedBy;
    }
}
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="q501">
        <id name="id">
            <generator class="increment"></generator>
        </id>
        <property name="qname"></property>

        <bag name="answers" cascade="all">
            <key column="type"></key>
            <one-to-many class="com.yiibai.Answer" />
        </bag>

    </class>

    <class name="com.yiibai.Answer" table="ans501">
        <id name="id">
            <generator class="increment"></generator>
        </id>
        <property name="answername"></property>
        <property name="postedBy"></property>
    </class>

</hibernate-mapping>
XML

3)创建配置文件

此文件包含有关数据库和映射文件的信息。hibernate.cfg.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)创建存储数据的类

在这个类中,我们存储Question类的数据。MainTest.java文件中的代码如下所示 -

package com.yiibai;

import java.util.ArrayList;

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();

        Answer ans1 = new Answer();
        ans1.setAnswername("java is a programming language");
        ans1.setPostedBy("Ravi Su");

        Answer ans2 = new Answer();
        ans2.setAnswername("java is a platform");
        ans2.setPostedBy("Sudhir Lee");

        Answer ans3 = new Answer();
        ans3.setAnswername("Servlet is an Interface");
        ans3.setPostedBy("Jai Wong");

        Answer ans4 = new Answer();
        ans4.setAnswername("Servlet is an API");
        ans4.setPostedBy("Arun");

        ArrayList<Answer> list1 = new ArrayList<Answer>();
        list1.add(ans1);
        list1.add(ans2);

        ArrayList<Answer> list2 = new ArrayList<Answer>();
        list2.add(ans3);
        list2.add(ans4);

        Question question1 = new Question();
        question1.setQname("What is Java?");
        question1.setAnswers(list1);

        Question question2 = new Question();
        question2.setQname("What is Servlet?");
        question2.setAnswers(list2);

        session.persist(question1

相关文章: