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

注: 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;
} }
Java

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>
XML

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>
XML

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()); // printing answers
List<String> list21 = q.getAnswers();
Iterator<String> itr2 = list21.iterator();
while (itr2.hasNext()) {
System.out.println(itr2.next());
} }
session.close();
System.out.println("success"); }
}
Java

执行上面代码,得到以下输出结果 -

log4j:WARN No appenders could be found for logger (org.jboss.logging).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
Sun Mar 26 05:18:56 CST 2017 WARN: Establishing SSL connection without server's identity verification is not recommended. According to MySQL 5.5.45+, 5.6.26+ and 5.7.6+ requirements SSL connection must be established by default if explicit option isn't set. For compliance with existing applications not using SSL the verifyServerCertificate property is set to 'false'. You need either to explicitly disable SSL by setting useSSL=false, or set useSSL=true and provide truststore for server certificate verification.
Hibernate: select max(id) from question_100
Hibernate: insert into question_100 (qname, id) values (?, ?)
Hibernate: insert into question_100 (qname, id) values (?, ?)
Hibernate: insert into answer_100 (qid, type, answer) values (?, ?, ?)
Hibernate: insert into answer_100 (qid, type, answer) values (?, ?, ?)
Hibernate: insert into answer_100 (qid, type, answer) values (?, ?, ?)
Hibernate: insert into answer_100 (qid, type, answer) values (?, ?, ?)
Hibernate: select question0_.id as id1_1_, question0_.qname as qname2_1_ from question_100 question0_
Question Name: What is Java?
Hibernate: select answers0_.qid as qid1_0_0_, answers0_.answer as answer3_0_0_, answers0_.type as type2_0_ from answer_100 answers0_ where answers0_.qid=?
java is a programming language
java is a platform
Question Name: What is Servlet?
Hibernate: select answers0_.qid as qid1_0_0_, answers0_.answer as answer3_0_0_, answers0_.type as type2_0_ from answer_100 answers0_ where answers0_.qid=?
Servlet is an Interface
Servlet is an API
Question Name: What is Java?
Hibernate: select answers0_.qid as qid1_0_0_, answers0_.answer as answer3_0_0_, answers0_.type as type2_0_ from answer_100 answers0_ where answers0_.qid=?
java is a programming language
java is a platform
Question Name: What is Servlet?
Hibernate: select answers0_.qid as qid1_0_0_, answers0_.answer as answer3_0_0_, answers0_.type as type2_0_ from answer_100 answers0_ where answers0_.qid=?
Servlet is an Interface
Servlet is an API
Question Name: What is Java?
Hibernate: select answers0_.qid as qid1_0_0_, answers0_.answer as answer3_0_0_, answers0_.type as type2_0_ from answer_100 answers0_ where answers0_.qid=?
java is a programming language
java is a platform
Question Name: What is Servlet?
Hibernate: select answers0_.qid as qid1_0_0_, answers0_.answer as answer3_0_0_, answers0_.type as type2_0_ from answer_100 answers0_ where answers0_.qid=?
Servlet is an Interface
Servlet is an API
Question Name: Java 是什么?
java is a programming language
java is a platform
Question Name: Hibernate 是什么?
Servlet is an Interface
Servlet is an API
success

集合映射中的映射列表(使用xml文件)的更多相关文章

  1. 用java语言将数据库中的数据表转换为xml文件的通用程序(细化)

    转自:https://www.cnblogs.com/wudage/p/7650685.html 总是在网络上copy别人的源代码,今天我也贴出自己今天写的源码,相信这个程序会对大家在平时的工作中需要 ...

  2. Android中通过代码获取arrays.xml文件中的数据

    android工程res/valuse文件夹下的arrays.xml文件中用于放各种数组数据,比如字符串数组.整型数组等,数组中的数据可能是具体的值,也有可能是对资源数据的引用,下面针对这两种情况通过 ...

  3. 在Android中把内容写到XML文件中

    在Android中把内容写到XML文件中 saveXmlButton.setOnClickListener(new OnClickListener() { @Override public void ...

  4. 集合映射中的映射包(使用xml文件)

    如果持久类有List对象,我们可以通过列表或者bag元素在映射文件中映射. 这个包(bag)就像List一样,但它不需要索引元素. 在这里,我们使用论坛的场景: 论坛中一个问题有多个答案. 我们来看看 ...

  5. 用 Qt 中的 QDomDocument类 处理 XML 文件(下)

      QDomDocument doc; 1).创建根节点:QDomElement root = doc.documentElement("rootName " ); 2).创建元素 ...

  6. Java中使用DOM4J来生成xml文件和解析xml文件

    一.前言 现在有不少需求,是需要我们解析xml文件中的数据,然后导入到数据库中,当然解析xml文件也有好多种方法,小编觉得还是DOM4J用的最多最广泛也最好理解的吧.小编也是最近需求里遇到了,就来整理 ...

  7. 如何将数据库中的表导成XML文件

    1.现将数据库中的信息读到DataTable中 2.用函数将DataTable转为string private string ConvertDataTableToXML(DataTable dt) { ...

  8. 用 Qt 中的 QDomDocument类 处理 XML 文件(上)

      我们可以看到,如果所要读取的XML文件不是很大,采用DOM读取方法还是很便捷的,由于我用的也是DOM树读取的方法,所以,本文所介绍的也主要是基于DOM的方法读取. 根据常用的操作,我简单的把对XM ...

  9. 用 Qt 中的 QDomDocument类 处理 XML 文件

    XML,全称为 “可扩展标记语言”(extensible markup language).是一种非常方便的数据交换与数据存储的工具. 我们在取得一个XML格式的文件后,需要作句法分析去提取发布方提供 ...

随机推荐

  1. Swift,枚举

    枚举类型判断 1.设置并利用枚举 enum Weacher{ case a case b case c } var d=Weacher.b switch d{ case .a: print(" ...

  2. Mac的文件比对工具:Meld、Beyond Compare

    Meld开源免费 Beyond Compare可以在Windows.Mac下使用,但是收费,需要自己破解

  3. [转载]使用32位64位交叉编码混淆来打败静态和动态分析工具 - wildsator

    0×00 摘要 混淆是一种能增加二进制分析和逆向工程难度与成本的常用技术.主流的混淆技术都是着眼于使用与目标CPU相同的机器代码,在相同的处理器模式下,隐藏代码并进行控制.本文中引入了一种新的混淆方法 ...

  4. 自建Saltstack的repo软件源仓库

    因为Saltstack自己的repo源是在国外,在国内服务器yum安装Saltstack的时候下载软件包就非常慢,很多情况下还经常下载失败,其实软件包总大小只有10M左右,如果这样安装多台minion ...

  5. javascript快速入门22--Ajax简介

    Ajax是什么? 首先,Ajax是什么?一个很酷的新兴词汇!仅仅是某种早就有了的技术的一种新说法而已! Ajax是指一种创建交互式网页应用的网页开发技术.要谈到网页应用程序,则必须从WEB的历史来讲: ...

  6. Java8 对多个异步任务进行流水线操作(笔记)

    现在我们要对商店商品进行折扣服务.每个折扣代码对应不同的折扣率,使用一个枚举变量Discount.Code来实现这一想法,具体代码如下所示. 以枚举类型定义的折扣代码 /** * 折扣服务api * ...

  7. MyISAM的key_buffer_size和InnoDB的innodb_buffer_pool_size

    一.MyISAM的key_buffer_size MyISAM的索引方式是非聚集索引,主索引和其他索引没有本质区别,在data域都是存储了具体记录行的地址.key_buffer_size规定了系统将多 ...

  8. 微信小程序bindtap和catchtap区别

    bindtap可以产生冒泡事件 catchtap只自身触发事件,不会传递到父视图         文章来源:刘俊涛的博客 地址:http://www.cnblogs.com/lovebing 欢迎关注 ...

  9. JavaScript原生函数(内置函数)

    1.JavaScript原生函数(内置函数) JavaScript原生函数(内置函数)有: String() Number() Boolean() Array() Object() Function( ...

  10. Openfiler 之Linux 安装ISCSI initiator和自动挂载

    OPENFILER做TARGET,RED HAT做客户端,如果默认没有安装ISCSI initiator的话,可以在光盘上找到RPM包直接安装.service iscsi start,启动服务,ser ...