如果我们的持久化类中有List对象,可以在映射文件中通过<list>或<bag>元素来映射List。Bag类似于List,但不需要索引元素。

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

3-1.png

让我们看看如何在映射文件中实现bag:

<class name="cn.javatiku.Question" table="q100">  
       ...        
          <bag name="answers" table="ans100">  
          <key column="qid"></key>  
          <element column="answer" type="string"></element>  
          </bag>  
            
       ...  
</class>  

在集合映射中映射Bag的示例

在这个示例中,我们将看到通过bag进行集合映射的完整示例。这是一个bag存储值而不是实体引用的示例,因此我们将使用element而不是one-to-many。如果你看过映射List的示例,除了映射文件中使用bag代替list之外,其余都是一样的。

1) 创建持久化类

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

package cn.javatiku;  
  
import java.util.List;  
  
public class Question {  
private int id;  
private String qname;  
private List<String> answers;  
  
//getters and setters  
  
}  

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

这里,我们创建了question.hbm.xml文件来定义list。

<?xml version='1.0' encoding='UTF-8'?>  
<!DOCTYPE hibernate-mapping PUBLIC  
          "-//Hibernate/Hibernate Mapping DTD 5.3//EN"  
          "http://hibernate.sourceforge.net/hibernate-mapping-5.3.dtd">  
  
<hibernate-mapping>  
 <class name="cn.javatiku.Question" table="q101">  
   <id name="id">  
     <generator class="increment"></generator>  
   </id>  
   <property name="qname"></property>  
            
   <bag name="answers" table="ans101">  
     <key column="qid"></key>  
     <element column="answer" type="string"></element>  
   </bag>  
            
 </class>  
            
</hibernate-mapping>  

3) 创建配置文件

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

<?xml version='1.0' encoding='UTF-8'?>  
<!DOCTYPE hibernate-configuration PUBLIC  
          "-//Hibernate/Hibernate Configuration DTD 5.3//EN"  
          "http://hibernate.sourceforge.net/hibernate-configuration-5.3.dtd">  
  
<!-- Generated by MyEclipse Hibernate Tools.                   -->  
<hibernate-configuration>  
  
    <session-factory>  
        <property name="hbm2ddl.auto">update</property>  
        <property name="dialect">org.hibernate.dialect.Oracle9Dialect</property>  
        <property name="connection.url">jdbc:oracle:thin:@localhost:1521:xe</property>  
        <property name="connection.username">system</property>  
        <property name="connection.password">jtp</property>  
        <property name="connection.driver_class">oracle.jdbc.driver.OracleDriver</property>  
    <mapping resource="question.hbm.xml"/>  
    </session-factory>  
  
</hibernate-configuration>  

4) 创建存储数据的类

在这个类中,我们存储了Question类的数据。

package cn.javatiku;    
    
import java.util.ArrayList;    
  
import org.hibernate.Session;  
import org.hibernate.SessionFactory;  
import org.hibernate.Transaction;  
import org.hibernate.boot.Metadata;  
import org.hibernate.boot.MetadataSources;  
import org.hibernate.boot.registry.StandardServiceRegistry;  
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;  
    
public class StoreData {    
 public static void main(String[] args) {    
      
     StandardServiceRegistry ssr=new StandardServiceRegistryBuilder().configure("hibernate.cfg.xml").build();  
     Metadata meta=new MetadataSources(ssr).getMetadataBuilder().build();  
       
     SessionFactory factory=meta.buildSessionFactory();  
     Session session=factory.openSession();  
       
    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("What is Java?");    
    question1.setAnswers(list1);    
        
    Question question2=new Question();    
    question2.setQname("What is Servlet?");    
    question2.setAnswers(list2);    
        
    session.persist(question1);    
    session.persist(question2);    
        
    t.commit();    
    session.close();    
    System.out.println("success");    
 }    
}    

输出

3-2.png
3-3.jpg

如何获取数据

这里,我们使用HQL来获取Question类的所有记录,包括答案。在这种情况下,它从功能依赖的两个表中获取数据。

package cn.javatiku;    
    
import javax.persistence.TypedQuery;  
import java.util.*;  
import org.hibernate.*;  
import org.hibernate.boot.Metadata;  
import org.hibernate.boot.MetadataSources;  
import org.hibernate.boot.registry.StandardServiceRegistry;  
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;    
  
    
public class FetchData {    
public static void main(String[] args) {    
        
    StandardServiceRegistry ssr=new StandardServiceRegistryBuilder().configure("hibernate.cfg.xml").build();  
     Metadata meta=new MetadataSources(ssr).getMetadataBuilder().build();  
       
     SessionFactory factory=meta.buildSessionFactory();  
     Session session=factory.openSession();  
        
    TypedQuery query=session.createQuery("from Question");    
    List<Question> list=query.getResultList();    
        
    Iterator<Question> itr=list.iterator();    
    while(itr.hasNext()){    
        Question q=itr.next();    
        System.out.println("Question Name: "+q.getQname());    
            
        //printing answers    
        List<String> list2=q.getAnswers();    
        Iterator<String> itr2=list2.iterator();    
        while(itr2.hasNext()){    
            System.out.println(itr2.next());    
        }    
            
    }    
    session.close();    
    System.out.println("success");    
        
}    
}    

输出

3-4.jpg

标签: Hibernate, Hibernate教程, Hibernate框架, Hibernate框架设计, Hibernate初级教程, Hibernate框架用法, Hibernate指南, Hibernate入门, Hibernate中级教程, Hibernate进阶教程, Hibernate高级教程, Hibernate下载