如果持久类有List对象,我们可以通过列表或者bag元素在映射文件中映射。 这个包(bag)就像List一样,但它不需要索引元素。

在这里,我们使用论坛的场景: 论坛中一个问题有多个答案。

我们来看看如何在映射文件中实现包(bag):

<class name="com.yiibai.Question" table="q100">
...
<bag name="answers" table="ans100">
<key column="qid"></key>
<element column="answer" type="string"></element>
</bag> ...
</class>
Java

在集合映射中映射包的示例

在这个例子中,我们将学习包(bag)的集合映射的完整示例。 这是一个bag的例子,如果它存储的值不是实体引用,这就是为什么要使用element元素标签来代替one-to-many。 如果您已经看过映射列表示例,这个示例与列表示例的所有情况下都是相同的,而是在文件映射中使用bag而不是列表(list)。

创建一个Java项目:bagstring,完整的项目结构如下所示 -

1)创建持久类

这个持久化类定义了类的属性,包括List。下面是 Question.java 文件的代码 -

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="q101">
<id name="id">
<generator class="increment"></generator>
</id>
<property name="qname"></property> <bag name="answers" table="ans101">
<key column="qid"></key>
<element column="answer" type="string"></element>
</bag>
</class> </hibernate-mapping>
XML

3)创建配置文件

此文件包含有关数据库和映射文件的信息。hibernate.cfg.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类的数据。

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(); 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("Python is an Interface");
list2.add("Python is an API"); Question question1 = new Question();
question1.setQname("What is Java?");
question1.setAnswers(list1); Question question2 = new Question();
question2.setQname("What is Python?");
question2.setAnswers(list2); session.persist(question1);
session.persist(question2); t.commit(); session.close();
System.out.println("success"); }
}
Java

如何获取数据

在这里,我们使用HQL来获取Question类的所有记录,包括答案。 在这种情况下,它从功能相关的两个表中获取数据。FetchData.java代码如下所示 -

package com.yiibai;

import java.util.*;

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

运行示例代码

首先运行 MainTest.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 21:14:36 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 q101
Hibernate: insert into q101 (qname, id) values (?, ?)
Hibernate: insert into q101 (qname, id) values (?, ?)
Hibernate: insert into ans101 (qid, answer) values (?, ?)
Hibernate: insert into ans101 (qid, answer) values (?, ?)
Hibernate: insert into ans101 (qid, answer) values (?, ?)
Hibernate: insert into ans101 (qid, answer) values (?, ?)
success
Shell

运行 FetchData.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 21:08:23 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 question0_.id as id1_1_, question0_.qname as qname2_1_ from q101 question0_
Question Name: What is Java?
Hibernate: select answers0_.qid as qid1_0_0_, answers0_.answer as answer2_0_0_ from ans101 answers0_ where answers0_.qid=?
java is a programming language
java is a platform
Question Name: What is Python?
Hibernate: select answers0_.qid as qid1_0_0_, answers0_.answer as answer2_0_0_ from ans101 answers0_ where answers0_.qid=?
Python is an Interface
Python is an API
success

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

  1. 集合映射中的映射列表(使用xml文件)

    如果持久化类具有List对象,我们可以通过映射文件中的类的<list>元素或注释来映射List. 在这里,我们正在使用论坛的场景,其中一个问题有多个答案. 在这里,我们使用论坛的场景,其中 ...

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

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

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

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

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

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

  5. Eclipse插件开发中对于Jar包和类文件引用的处理(彻底解决插件开发中的NoClassDefFoundError问题)(转)

    目的:Eclipse插件开发中,经常要引用第三方包或者是引用其他插件中的类,由于插件开发环境引用类路径的设置和运行平台引用类路径的设置不同,经常导致开发过程OK,一旦运行则出现NoClassDefFo ...

  6. 在java项目中怎样利用Dom4j解析XML文件获取数据

    在曾经的学习.net时常常会遇到利用配置文件来解决项目中一些须要常常变换的数据.比方数据库的连接字符串儿等.这个时候在读取配置文件的时候.我们一般会用到一个雷configuration,通过这个类来进 ...

  7. python 常用包之xml文件处理

    1,处理xml的包 from xml.etree import ElementTree as ET 2,如何写出xml文件 xml文件和html中的元素很像,有父级子集之说, root = ET.El ...

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

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

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

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

随机推荐

  1. python 列表合并

    列表合并主要有以下方法: 1.用list的extend方法,L1.extend(L2),该方法将参数L2的全部元素添加到L1的尾部 结果:[1, 2, 3, 4, 5, 1, 20, 30] 2.用切 ...

  2. 【云计算】mesos+marathon 服务发现、负载均衡、监控告警方案

    Mesos-dns 和 Marathon-lb 是mesosphere 官网提供的两种服务发现和负载均衡工具.官方的文档主要针对DCOS,针对其它系统的相关中文文档不多,下面是我在Centos7上的安 ...

  3. nginx出现的403错误

    参考这篇文章: http://www.server110.com/nginx/201309/1792.html 我是这样解决的: 为了保证文件能正确执行,nginx既需要文件的读权限,又需要文件所有父 ...

  4. webmagic 初始化 startRequests

    在spider类中有三个方法可以初始化startRequests.可以对这些地方进行扩展. /** * create a spider with pageProcessor. * * @param p ...

  5. jquery 中attr和prop的区别

    在jQuery API中也有专门解释: Attributes VS. Properties 在一些特殊的情况下,attributes和properties的区别非常大.在jQuery1.6之前,.at ...

  6. plsql连接oracle数据库

    步骤 (1)线上安装oracle数据库(已配好) (2)本地远程连接.安装oracle客户端(运行时) (3)安装plsql. (4)oracle客户端可以不用配置,直接在plsql中数据访问验证

  7. Objective-C学习笔记(二十一)——函数的返回值与參数类型

    我们在之前的博客中涉及到的函数都没有參数,同一时候返回值也为void,即不须要返回值. 可是在以后的开发中.函数返回值和參数是必须涉及到的. 所以如今我们来讨论这个问题.我们还是以People类为例. ...

  8. Zigbee事件

    ZIGBEE事件有两类.系统定义事件和用户定义事件. 系统类事件是协议栈已定义好的.用户类事件是我们用户层面来定义的. 事件类号採用一个16bit的常量,使用独热码编码,独热码是仅仅有一个bit为1, ...

  9. 应用程序池和应用程序域的区别(Difference between application pool and application domain)

    来自StackOverFlow:  http://stackoverflow.com/questions/8486335/difference-between-an-application-domai ...

  10. Vue 常用属性汇总

    1.Vue实例常用属性 (1)数据 data:Vue 实例的数据对象 components:Vue实例配置局部注册组件 (2)类方法computed:计算属性 watch:侦听属性 filters:过 ...