如果持久化类具有包含实体引用的列表(List)对象,则需要使用一对多关联来映射列表元素。

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

在这种情况下,一个问题可以有多个答案,每个答案可能有自己的信息,这就是为什么在持久化类中使用列表(包含Answer类的引用)来表示一系列答案。

下面来看看看持久化类有列表对象(包含Answer类对象)。

package com.yiibai;  

import java.util.List;  

public class Question {  
    private int id;  
    private String qname;  
    private List<Answer> answers;  
    //getters and setters  

}

Question类有自己的信息,如idanswernamepostedBy

package com.yiibai;  

public class Answer {  
    private int id;  
    private String answername;  
    private String postedBy;  
    //getters and setters  

    }  
}
Java

Question类具有包含实体引用的列表对象(即Answer类对象)。在这个示例中,需要使用一对多列表来映射此对象。 下面来看看如何映射它。

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

List中的一对多个映射的完整示例

在这个例子中,我们将看到包含实体引用的映射列表的完整示例。创建一个项目:listonetomany,其完整的项目结构如下图所示 -
Hibernate一对多映射列表实例(使用xml文件)

1)创建持久类

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

Question.java

package com.yiibai;

import java.util.List;

public class Question {
    private int id;
    private String qname;
    private List<Answer> 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<Answer> getAnswers() {
        return answers;
    }

    public void setAnswers(List<Answer> 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 answername + " by: " + postedBy;
    }
}
Java

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

在这里,我们创建了用于定义列表(List)的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>

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

    </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.hnm.cfg.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 Wong");

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

        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

相关文章:

  • 2022-12-23
  • 2021-04-01
  • 2021-10-23
  • 2022-12-23
  • 2022-01-23
  • 2021-06-24
  • 2022-01-21
  • 2022-12-23
猜你喜欢
  • 2021-10-28
  • 2022-12-23
  • 2022-12-23
  • 2021-09-01
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
相关资源
相似解决方案