如果持久化類具有List對象,我們可以通過映射文件中的類的<list>
元素或注釋來映射List
。
在這里,我們正在使用論壇的場景,其中一個問題有多個答案。
在這里,我們使用論壇的場景,其中一個問題有多個答案。
我們來看看如何在映射文件中實現列表(List):
<class name="com.yiibai.Question" table="q100"> ... <list name="answers" table="ans100"> <key column="qid"></key> <index column="type"></index> <element column="answer" type="string"></element> </list> ... </class>
注:
List
和Map
是基於索引的集合,因此將在表中創建一個額外的列進行索引。
集合映射中的映射列表(List)示例
在這個例子中,我們將看到列表(List)在集合映射的完整示例。 這是List中存儲字符串值而不是實體引用的示例,這就是為什么要在列表元素中使用element
標簽而不是one-to-many
標簽的元素。
這個示例項目的完整結構如下圖所示 -
1)創建持久化類
這個持久化類定義了類的屬性,包括List
。
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; } }
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="question_100"> <id name="id"> <generator class="increment"></generator> </id> <property name="qname"></property> <list name="answers" table="answer_100"> <key column="qid"></key> <index column="type"></index> <element column="answer" type="string"></element> </list> </class> </hibernate-mapping>
3)創建配置文件
此文件包含有關數據庫和映射文件的信息。
文件:hibernate.hnm.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>
4)創建存儲數據的類
在這個類(MainTest.java
)中,用來存儲Question
類的數據。使用HQL來獲取Answer
類的所有記錄,包括答案。 在這個示例中,它從功能相關的兩個表中獲取數據。
package com.yiibai; import java.util.ArrayList; import java.util.Iterator; import java.util.List; 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(); 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("Java 是什么?"); question1.setAnswers(list1); Question question2 = new Question(); question2.setQname("Hibernate 是什么?"); question2.setAnswers(list2); session.persist(question1); session.persist(question2); t.commit(); // 查詢數據 Query<Question> query = session.createQuery("from Question"); List<Question> list = query.list(); Iterator<Question> itr = list.iterator(); while (itr.hasNext()) { Question q = itr.next(); System.out.println("Question Name: " + q.getQname())