如果持久化類具有包含實體引用的列表(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 } }
Question
類具有包含實體引用的列表對象(即Answer
類對象)。在這個示例中,需要使用一對多列表來映射此對象。 下面來看看如何映射它。
<list name="answers" cascade="all"> <key column="qid"></key> <index column="type"></index> <one-to-many class="com.yiibai.Answer"/> </list>
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; } }
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; } }
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>
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.