当前位置: 首页 > news >正文

java xml setdoctype_集合Set映射一对多(使用xml文件)

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

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

Set映射一对多关系示例

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

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

57f6d7358776bce63ce56ffdb009999a.png

Java代码

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

Question.java 代码如下所示 -

package com.yiibai;

import java.util.Set;

public class Question {

private int id;

private String qname;

private Set 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 getAnswers() {

return answers;

}

public void setAnswers(Set 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 文件内容如下-

/p>

"-//Hibernate/Hibernate Mapping DTD 3.0//EN"

"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

XML

question.hnm.xml 文件内容如下-

/p>

"-//Hibernate/Hibernate Mapping DTD 3.0//EN"

"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

inverse="true" lazy="true" fetch="select">

XML

hibernate.cfg.xml 文件内容如下-

/p>

"-//Hibernate/Hibernate Configuration DTD 3.0//EN"

"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">

update

com.mysql.jdbc.Driver

jdbc:mysql://localhost:3306/test

root

123456

org.hibernate.dialect.MySQL5InnoDBDialect

true

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 list = query.list();

Iterator itr = list.iterator();

while (itr.hasNext()) {

Question q = itr.next();

System.out.println("Question Name: " + q.getQname());

// printing answers

Set set = q.getAnswers();

Iterator 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

相关文章:

  • java dofinalize_Java finalize方法使用
  • java调用ecdh_Jecc(java椭圆曲线加密库)学习笔记及ECDH实现
  • java雷达_Java编写有关雷达问题,哪位高手帮个忙,谢谢~~~
  • 继承java_Java— 继承
  • java guid_细说Java生成GUID的实现方法
  • java多租户_(九十二)java版spring cloud 多租户社交电子商务-gateway(实现限流)...
  • foxpro mysql_Foxpro数据库命令汇总
  • java generatedvalue_java – 在JPA @GeneratedValue列中手动指定主键的值
  • java io byte_JavaIO之字节流学习笔记
  • 八大排序方法java_八大排序java
  • java一个类怎么调用另一个类的变量_如何在一个类里调用到另一个类的变量的值...
  • java return后执行_java 问题 如果前一个return执行了 那么后面的一系列System.out.println 还会执行吗...
  • java持久层_java访问持久层技术的进化
  • java set encoding file_系统变量file.encoding对Java的运行影响有多大?(转)good
  • java运行一段时间变慢_tomcat 运行程序很慢 运行一段时间就报错: java.lang.OutOfMemoryError: PermGen space...
  • JavaScript-如何实现克隆(clone)函数
  • [ 一起学React系列 -- 8 ] React中的文件上传
  • 【跃迁之路】【733天】程序员高效学习方法论探索系列(实验阶段490-2019.2.23)...
  • 2017前端实习生面试总结
  • Docker容器管理
  • ERLANG 网工修炼笔记 ---- UDP
  • iOS | NSProxy
  • IOS评论框不贴底(ios12新bug)
  • Java比较器对数组,集合排序
  • Java面向对象及其三大特征
  • PHP 程序员也能做的 Java 开发 30分钟使用 netty 轻松打造一个高性能 websocket 服务...
  • Python 使用 Tornado 框架实现 WebHook 自动部署 Git 项目
  • React 快速上手 - 07 前端路由 react-router
  • spring cloud gateway 源码解析(4)跨域问题处理
  • 分享几个不错的工具
  • 规范化安全开发 KOA 手脚架
  • 利用DataURL技术在网页上显示图片
  • 一天一个设计模式之JS实现——适配器模式
  • 应用生命周期终极 DevOps 工具包
  • 由插件封装引出的一丢丢思考
  • hi-nginx-1.3.4编译安装
  • ​queue --- 一个同步的队列类​
  • #预处理和函数的对比以及条件编译
  • $.extend({},旧的,新的);合并对象,后面的覆盖前面的
  • (附源码)ssm高校社团管理系统 毕业设计 234162
  • (附源码)ssm户外用品商城 毕业设计 112346
  • (附源码)小程序儿童艺术培训机构教育管理小程序 毕业设计 201740
  • (九)信息融合方式简介
  • (六)库存超卖案例实战——使用mysql分布式锁解决“超卖”问题
  • (十三)Java springcloud B2B2C o2o多用户商城 springcloud架构 - SSO单点登录之OAuth2.0 根据token获取用户信息(4)...
  • (转)jQuery 基础
  • (转)人的集合论——移山之道
  • *_zh_CN.properties 国际化资源文件 struts 防乱码等
  • .mysql secret在哪_MYSQL基本操作(上)
  • .NET 4.0网络开发入门之旅-- 我在“网” 中央(下)
  • .NET CLR Hosting 简介
  • .net core开源商城系统源码,支持可视化布局小程序
  • .NET Framework Client Profile - a Subset of the .NET Framework Redistribution
  • .NET I/O 学习笔记:对文件和目录进行解压缩操作
  • .Net各种迷惑命名解释