如果持久化类具有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. High Speed Inter-CHIP USB 2.0 PHY

    转载:http://arasan.com/products/usb/usb-2-0/hsic-phy/ High Speed Inter-CHIP USB 2.0 PHY USB is the ubi ...

  2. 【java】在分页查询结果中对最后的结果集List进行操作add()或remove()操作,报错:java.lang.UnsupportedOperationException

    场景: 在分页查询结果中对最后的结果集List进行操作add()或remove()操作,报错:java.lang.UnsupportedOperationException 错误: java.lang ...

  3. RTOS系统与Linux系统的区别

    RTOS是实时操作系统 Linux是时分系统,不过可以通过配置内核改成实时系统 分时操作系统 英文:Time-sharing Operating System  释义:使一台计算机同时为几个.几十个甚 ...

  4. javascript快速入门2--变量,小学生数学与简单的交互

    变量 对于变量的理解:变量是数据的代号.如同人的名字一样. var num;//在JavaScript中使用关键字var声明一个变量 在JavaScript中,使用上面的语法,就可以声明一个变量,以便 ...

  5. 小二助手(react应用框架)-http访问

    浏览地址http://118.25.217.253:4000 账号test密码123   qq讨论群:836719189 要写这个系统,就需要数据来源,让我们先来看看如果通过客户端调用服务端api拿到 ...

  6. apache poi合并单元格设置边框

    HSSFWorkbook wb = new HSSFWorkbook(); HSSFSheet sheet = wb.createSheet(); //创建一个样式 HSSFCellStyle sty ...

  7. scrapy-splash抓取动态数据例子十三

    一.介绍 本例子用scrapy-splash通过搜狗搜索引擎,输入给定关键字抓取微信资讯信息. 给定关键字:数字:融合:电视 抓取信息内如下: 1.资讯标题 2.资讯链接 3.资讯时间 4.资讯来源 ...

  8. js获取url參数值的两种方式具体解释

    有个url例如以下: http://passport.csdn.net/account/login? from=http%3a%2f%2fwrite.blog.csdn.net%2fpostedit ...

  9. hdu 5265 技巧题 O(nlogn)求n个数中两数相加取模的最大值

    pog loves szh II Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) ...

  10. opencv提取surf特征点出现的错误

    opencv实现surf特征的提取.本来是一个非常easy的代码,结果我执行时却出现了各种错误,以下来谈谈我出现的错误及问题的解决过程. 首先,我把提取surf特征的过程整合成了一个函数,我单独建立一 ...