如果持久化类设置了包含实体引用的对象,则需要使用一对多关联来映射集合(Set)元素。 我们可以通过任意一个Set集合来映射这个列表对象。

下面来看看看设置对象的持久化类。 在这种情况下,一个问题可以有很多答案,每个答案可能有自己的信息,这就是为什么使用set标签元素来表示一个答案(Answer类)集合。

Set映射一对多关系示例

在这个示例中,使用Set实现一对多和多对一关系映射。以论坛中的问题和答案为例,从一个问题可获取这个问题的所有回答(一对多),从一个问题反关联(多对一)得到问题信息。

创建一个名称为: setonetomany 的Java项目,其结构如下所示 -

Java代码

首先,将运行程序创建表并将对应数据插入到表中,然后再从表中读取数据。

Question.java 代码如下所示 -

package com.yiibai;

import java.util.Set;

public class Question {
private int id;
private String qname;
private Set<Answer> 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 Set<Answer> getAnswers() {
return answers;
} public void setAnswers(Set<Answer> answers) {
this.answers = answers;
} }
Java

Answer.java 代码如下所示 -

package com.yiibai;

public class Answer {
private int id;
private String answername;
private String postedBy;
private int qid;
private Question question;
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 int getQid() {
return qid;
}
public void setQid(int qid) {
this.qid = qid;
}
public Question getQuestion() {
return question;
}
public void setQuestion(Question question) {
this.question = question;
} public String toString(){
return this.answername+", postby : "+this.postedBy;
} }
Java

配置文件

一共有三个配置文件,它们分别如下:

answer.hnm.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.Answer" table="a1002">
<id name="id">
<generator class="increment"></generator>
</id>
<property name="answername"></property>
<property name="postedBy"></property>
<many-to-one name="question" class="com.yiibai.Question" fetch="select">
<column name="qid" not-null="true" />
</many-to-one>
</class> </hibernate-mapping>
XML

question.hnm.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="q1002">
<id name="id">
<generator class="increment"></generator>
</id>
<property name="qname"></property> <set name="answers" table="a1002"
inverse="true" lazy="true" fetch="select">
<key>
<column name="qid" not-null="true" />
</key>
<one-to-many class="com.yiibai.Answer" />
</set> </class> </hibernate-mapping>
XML

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" />
<mapping resource="answer.hbm.xml" />
</session-factory> </hibernate-configuration>
XML

运行示例

MainTest.java文件的代码如下 -

package com.yiibai;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.Set; 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(); Question question1 = new Question();
question1.setQname("What is Java?");
session.save(question1); Answer ans1 = new Answer();
ans1.setAnswername("java is a programming language");
ans1.setPostedBy("Ravi Su");
ans1.setQuestion(question1);
//question1.getAnswers().add(ans1); session.save(ans1); Answer ans2 = new Answer();
ans2.setAnswername("java is a platform");
ans2.setPostedBy("Sudhir Lee");
ans2.setQuestion(question1);
session.save(ans2); t.commit();
session.close(); System.out.println("success");
}
}
Java

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
Set<Answer> set = q.getAnswers();
Iterator<Answer> itr2 = set.iterator();
while (itr2.hasNext()) {
Answer an = (Answer)itr2.next();
System.out.println(an.getAnswername());
} }
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 23:33:27 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: create table a1002 (id integer not null, answername varchar(255), postedBy varchar(255), qid integer not null, primary key (id)) engine=InnoDB
Hibernate: create table q1002 (id integer not null, qname varchar(255), primary key (id)) engine=InnoDB
Hibernate: alter table a1002 add constraint FK9la7qmitcg24x22e3dh3q9kjv foreign key (qid) references q1002 (id)
Hibernate: alter table q1002 add constraint FK1ap2g6pq36pyrpjaw5o31yxdf foreign key (id) references q1002 (id)
Hibernate: select max(id) from q1002
Hibernate: select max(id) from a1002
Hibernate: insert into q1002 (qname, id) values (?, ?)
Hibernate: insert into a1002 (answername, postedBy, qid, id) values (?, ?, ?, ?)
Hibernate: insert into a1002 (answername, postedBy, qid, id) 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 23:42:52 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 q1002 question0_
Question Name: What is Java?
Hibernate: select answers0_.qid as qid4_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_, answers0_.qid as qid4_0_1_ from a1002 answers0_ where answers0_.qid=?
java is a platform
java is a programming language
success

集合Set映射一对多(使用xml文件)的更多相关文章

  1. 集合映射Set(使用xml文件)

    如果持久类具有Set对象,可以在映射文件中使用set元素映射Set集合. set元素不需要索引元素. List和Set之间的区别是: Set只存储唯一的值. 我们来看看我们如何在映射文件中实现集合: ...

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

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

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

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

  4. JPA 对象关系映射总结(一)---persistence.xml 文件配置要点

    1. <property name="hibernate.hbm2ddl.auto" value="update"/>,这里表示的 功能是: 自动创 ...

  5. [原创]java WEB学习笔记77:Hibernate学习之路---Hibernate 版本 helloword 与 解析,.环境搭建,hibernate.cfg.xml文件及参数说明,持久化类,对象-关系映射文件.hbm.xml,Hibernate API (Configuration 类,SessionFactory 接口,Session 接口,Transaction(事务))

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

  6. Android修改XML文件

    最近在项目中需要使用XML记录数据,网上这方面的文章较少,记录一下 使用DOM方式 /** * 追加内容到XML文档 * @param instructions * @throws ParserCon ...

  7. Win10系列:VC++ XML文件解析

    XML文件按照元素标记来存储数据,通过遍历这些元素标记可以得到XML文件中所保存的数据.在C++/CX的类库中并未定义用于解析XML文件的类,但C++提供了能解析XML文件的框架和类库,如msxml4 ...

  8. Hibernate使用xml文件的每个类层次一张表

    通过这种继承策略,我们可以通过单表映射整个层次结构. 这里,在表中创建一个额外的列(也称为discriminator列)来标识该类. 让我们先了解问题.下面给出的整个层次类映射到数据库的一个表中图解说 ...

  9. hibernate映射xml文件配置之一对多,多对多

    一对多配置 [1]班级和学生模型 --->班级可容纳多个学生 --->学生只能属于一个班级 [2]一对多配置中的关系维护(inverse) --->一端放弃关系的维护 ---> ...

随机推荐

  1. Microsoft office(1)分页符和分节符

    Microsoft office下的页面布局中的分页符和分节符的区别: 分页符:标记一页的终止并开始下一页的点 分节符:插入分节符并在下一页开始新节 一般情况下,分节符在分页符外围,分节符一般是各种格 ...

  2. python安全编程

    ##入门 这将是第一个一系列关于python编程的博客文章.python是一门非常强大的语言,因为它有信息安全社区的支撑.这意味着很多工具都是由python编写并且可以在脚本中调用很多模块.使用模块的 ...

  3. ISP图像调试工程师——3D和2D降噪(熟悉图像预处理和后处理技术)

    2D降噪:只在2维空间域上进行降噪处理.基本方法:对一个像素将其与周围像素平均,平均后噪声降低,但缺点是会造成画面模糊,特别是物体边缘部分.因此对这种算法的改进主要是进行边缘检测,边缘部分的像素不用来 ...

  4. webservice ssl双向认证配置

    1.在tomcat中安装axis2插件 2.生成证书,用jdk自带的keytool 服务端 keytool -genkey -alias Server -dname "CN=192.168. ...

  5. LVS负载均衡之NAT模式部署

    1.LVS的NAT模式介绍 参考自官网:http://www.linuxvirtualserver.org/zh/lvs3.html 由于IPv4中IP地址空间的日益紧张和安全方面的原因,很多网络使用 ...

  6. JMS-activeMq发布订阅模式(非持久订阅)

    Publisher的代码: import javax.jms.Connection; import javax.jms.ConnectionFactory; import javax.jms.Deli ...

  7. Windows COM Surrogate 已停止工作怎么办

    已解决 如何解决"COM Surrogate 已停止工作"问题 悬赏分:15 - 解决时间:2008-7-6 16:55 Vista系统,经常出现这个提示框,烦人. 我试了网上有关 ...

  8. JavaScript--百度百科

    JavaScript一种直译式脚本语言,是一种动态类型.弱类型.基于原型的语言,内置支持类型.它的解释器被称为JavaScript引擎,为浏览器的一部分,广泛用于客户端的脚本语言,最早是在HTML(标 ...

  9. 【Java】Java_02环境配置

    JDK是什么?JRE是什么?JDK和JRE的区别? Java Runtime Environment (JRE) 包含: Java虚拟机.库函数.运行Java应用程序和Applet所必须文件 Java ...

  10. iOS开发-自动布局之autoresizingMask使用详解(Storyboard&Code)

    前言:现在已经不像以前那样只有一个尺寸,现在最少的IPHONE开发需要最少需要适配三个尺寸.因此以前我们可以使用硬坐标去设定各个控件的位置,但是现在的话已经不可以了,我们需要去做适配,也许你说可以使用 ...