如果持久化类具有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