如果持久化类具有包含实体引用的列表对象,则需要使用一对多关联来映射列表元素。 我们可以通过列表(list)或包(bag)来映射这个列表对象。

请注意,bag不是基于索引的,而list是基于索引的。

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

下面来看看看具有列表对象的持久化类。 在这种情况下,一个问题可以有多个答案,每个答案可能有自己的信息,这就是为什么这里要使用列表(list)元素(包含答案对象)代表一个答案集合。
Question类代码如下 -

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

Question类有自己的信息,如idanswernamepostedBy等。

package com.yiibai;

public class Answer {
private int id;
private String answername;
private String postedBy;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getAnswername() {
return answername;
}
public void setAnswername(String answername) {
this.answername = answername;
}
public String getPostedBy() {
return postedBy;
}
public void setPostedBy(String postedBy) {
this.postedBy = postedBy;
} }
Java

Question类具有包含实体引用的列表对象(即Answer类对象)。 在这种情况下,我们需要使用一对多的bag标签来映射此对象。 下面来看看看我们如何映射它。

<bag name="answers" cascade="all">
<key column="qid"></key>
<one-to-many class="com.yiibai.Answer"/>
</bag>
XML

通过一对多关联在集合映射中映射包的示例

在这个例子中,我们将看到包含实体引用的映射列表的完整示例。创建一个Java项目:bagonetomany,其完整的目录结构如下 -

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

Answer.java 代码如下所示 -

package com.yiibai;

public class Answer {
private int id;
private String answername;
private String postedBy;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getAnswername() {
return answername;
}
public void setAnswername(String answername) {
this.answername = answername;
}
public String getPostedBy() {
return postedBy;
}
public void setPostedBy(String postedBy) {
this.postedBy = postedBy;
} public String toString(){
return this.answername+", PostedBy "+this.postedBy;
}
}
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="q501">
<id name="id">
<generator class="increment"></generator>
</id>
<property name="qname"></property> <bag name="answers" cascade="all">
<key column="type"></key>
<one-to-many class="com.yiibai.Answer" />
</bag> </class> <class name="com.yiibai.Answer" table="ans501">
<id name="id">
<generator class="increment"></generator>
</id>
<property name="answername"></property>
<property name="postedBy"></property>
</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)创建存储数据的类

在这个类中,我们存储Question类的数据。MainTest.java文件中的代码如下所示 -

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(); Answer ans1 = new Answer();
ans1.setAnswername("java is a programming language");
ans1.setPostedBy("Ravi Su"); Answer ans2 = new Answer();
ans2.setAnswername("java is a platform");
ans2.setPostedBy("Sudhir Lee"); Answer ans3 = new Answer();
ans3.setAnswername("Servlet is an Interface");
ans3.setPostedBy("Jai Wong"); Answer ans4 = new Answer();
ans4.setAnswername("Servlet is an API");
ans4.setPostedBy("Arun"); ArrayList<Answer> list1 = new ArrayList<Answer>();
list1.add(ans1);
list1.add(ans2); ArrayList<Answer> list2 = new ArrayList<Answer>();
list2.add(ans3);
list2.add(ans4); Question question1 = new Question();
question1.setQname("What is Java?");
question1.setAnswers(list1); Question question2 = new Question();
question2.setQname("What is Servlet?");
question2.setAnswers(list2); session.persist(question1);
session.persist(question2); t.commit();
session.close(); System.out.println("success"); }
}
Java

如何获取列表的数据

在这里,我们使用HQL来获取Question类的所有记录,包括答案。 在这种情况下,它从功能相关的两个表中获取数据。 在这里,我们直接打印答案类的对象,但是我们已经在Answer类中覆盖了返回 answername和 postername 的toString()方法。 所以它打印answername 和 postername 而不是参考ID。

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<Answer> list2 = q.getAnswers();
Iterator<Answer> 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:54:43 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: alter table ans501 add constraint FKtppk9gq3v1rge6ntclgp1jucm foreign key (type) references q501 (id)
Hibernate: select max(id) from q501
Hibernate: select max(id) from ans501
Hibernate: insert into q501 (qname, id) values (?, ?)
Hibernate: insert into ans501 (answername, postedBy, id) values (?, ?, ?)
Hibernate: insert into ans501 (answername, postedBy, id) values (?, ?, ?)
Hibernate: insert into q501 (qname, id) values (?, ?)
Hibernate: insert into ans501 (answername, postedBy, id) values (?, ?, ?)
Hibernate: insert into ans501 (answername, postedBy, id) values (?, ?, ?)
Hibernate: update ans501 set type=? where id=?
Hibernate: update ans501 set type=? where id=?
Hibernate: update ans501 set type=? where id=?
Hibernate: update ans501 set type=? where id=?
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:51: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: alter table ans501 add constraint FKtppk9gq3v1rge6ntclgp1jucm foreign key (type) references q501 (id)
Hibernate: select question0_.id as id1_1_, question0_.qname as qname2_1_ from q501 question0_
Question Name: What is Java?
Hibernate: select answers0_.type as type4_0_0_, answers0_.id as id1_0_0_, answers0_.id as id1_0_1_, answers0_.answername as answerna2_0_1_, answers0_.postedBy as postedBy3_0_1_ from ans501 answers0_ where answers0_.type=?
java is a platform, PostedBy Sudhir Wong
Servlet is an API, PostedBy Arun
Question Name: What is Servlet?
Hibernate: select answers0_.type as type4_0_0_, answers0_.id as id1_0_0_, answers0_.id as id1_0_1_, answers0_.answername as answerna2_0_1_, answers0_.postedBy as postedBy3_0_1_ from ans501 answers0_ where answers0_.type=?
Question Name: What is Java?
Hibernate: select answers0_.type as type4_0_0_, answers0_.id as id1_0_0_, answers0_.id as id1_0_1_, answers0_.answername as answerna2_0_1_, answers0_.postedBy as postedBy3_0_1_ from ans501 answers0_ where answers0_.type=?
java is a programming language, PostedBy Ravi Su
java is a platform, PostedBy Sudhir Lee
Question Name: What is Servlet?
Hibernate: select answers0_.type as type4_0_0_, answers0_.id as id1_0_0_, answers0_.id as id1_0_1_, answers0_.answername as answerna2_0_1_, answers0_.postedBy as postedBy3_0_1_ from ans501 answers0_ where answers0_.type=?
Servlet is an Interface, PostedBy Jai Wong
Servlet is an API, PostedBy Arun
success

通过Bag一对多映射示例(使用xml文件)的更多相关文章

  1. Spring Framework框架解析(1)- 从图书馆示例来看xml文件的加载过程

    引言 这个系列是我阅读Spring源码后的一个总结,会从Spring Framework框架的整体结构进行分析,不会先入为主的讲解IOC或者AOP的原理,如果读者有使用Spring的经验再好不过.鉴于 ...

  2. 定义信息源的一些示例(xml文件)

    本文目录 1.订阅博客,简单一例 2.从网页获取信息,简单一例 3.充分使用callback回调代码 4.html_re中包含多个block 5.使用html_json这个worker,解析json数 ...

  3. Java读取CSV和XML文件方法

    游戏开发中,读取策划给的配置表是必不可少的,我在之前公司,策划给的是xml表来读取,现在公司策划给的是CSV表来读取,其实大同小异,也并不是什么难点,我就简单分享下Java如何读取XML文件和CSV文 ...

  4. struts-config.xml 文件:

    struts-config.xml配置文件是一个在Web客户端组件的视图和模型之间的联系,但你的项目的99.99就不会碰这些设置%.基本的配置文件包含以下主要内容: SN Interceptor &a ...

  5. PHP读取XML文件数据获取节点值

    最近在接入渠道的时候遇到接口返回是xml数据.现在接口数据返回json数据格式比较常见. 如何获取xml里面真正数据? 对象结果集合单个值的强制转换处理.(直接代码说明) demo示例:  创建xml ...

  6. ACEXML解析XML文件——简单示例程序

    掌握了ACMXML库解析XML文件的方法后,下面来实现一个比较完整的程序. 定义基本结构 xml文件格式如下 <?xml version="1.0"?> <roo ...

  7. springmvc 项目完整示例07 设置配置整合springmvc springmvc所需jar包springmvc web.xml文件配置

    前面主要是后台代码,spring以及mybatis的整合 下面主要是springmvc用来处理请求转发,展现层的处理 之前所有做到的,完成了后台,业务层和持久层的开发完成了 接下来就是展现层了 有很多 ...

  8. 使用pull方式解析xml文件示例:

    网上的示例太多,基本类似,个人在此做个简单的总结: 1.首先在工程的asserts目录下建一个book.xml文件: <?xml version="1.0" encoding ...

  9. IE下JS读取xml文件示例代码

    JS读取xml文件具体步骤为:创建DOM对象.加载xml文件(仅适用于IE)附示例代码,感兴趣的朋友可以参考下,希望对大家有所帮助使用javascript脚本读取xml文件,这里暂只考虑IE浏览器st ...

随机推荐

  1. 折腾kubernetes各种问题汇总

    折腾fluend-elasticsearch日志,折腾出一大堆问题,解决这些问题过程中,感觉又了解了不少. 1.如何删除不一致状态下的rc,deployment,service. 在某些情况下,经常发 ...

  2. t-SNE和LDA PCA的学习

    t-SNE 可以看这篇文章: http://bindog.github.io/blog/2016/06/04/from-sne-to-tsne-to-largevis/ LDA可以看这篇文章: htt ...

  3. Linux源码编译安装MySQL5.7

    目录[-] 一.环境准备: 二.升级系统: 三.做一些准备工作(以下Linux命令均在su到root用户操作): 四.开始编译安装mysql-5.7.9: 一.环境准备: 我尝试过以下环境都是能成功的 ...

  4. Druid对比Cassandra

    不是Cassandra专家, 如果描绘有错误, 请通过邮件列表或者其他方式告知, 我们会修正. Druid对扫描和聚合做了很大程度的优化, 不用提前计算就支持任意的向下钻取, 还可以实时摄入流式数据并 ...

  5. 【Hadoop】Hadoop RPC框架线程模型

    1.线程模型 2.参考资料: 源码级强力分析hadoop的RPC机制:http://weixiaolu.iteye.com/blog/1504898Hadoop RPC框架:http://blog.c ...

  6. Solr报错Index locked for write for core '***'. Solr now longer supports forceful unlocking via 'unlockOnStartup'

    unlockOnStartup 告知 Solr 忽略在多线程环境中用来保护索引的锁定机制.在某些情况下,索引可能会由于不正确的关机或其他错误而一直处于锁定,这就妨碍了添加和更新.将其设置为 true ...

  7. js 上传图片进行回显

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  8. [TypeScript] Deeply mark all the properties of a type as read-only in TypeScript

    We will look at how we can use mapped types, conditional types, self-referencing types and the “infe ...

  9. iOS tableView下拉图片放大

    事实上这个效果,本质上就是在你tableView下拉 造成offset时候. 保持你顶部图片的y坐标点还停留在下拉时屏幕的顶点(offset), 而图片的长度变为原始的height长度-(offset ...

  10. Python——Code Like a Pythonista: Idiomatic Python

    Code Like a Pythonista: Idiomatic Python 如果你有C++基础,那学习另一门语言会相对容易.因为C++即面向过程,又面向对象.它很底层,能像C一样访问机器:它也很 ...