如果持久化类具有包含实体引用的列表(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
类有自己的信息,如id
,answername
,postedBy
等
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
,其完整的项目结构如下图所示 -
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); session