文档章节

Hibernate 双向的多对一关联映射

萧小蚁
 萧小蚁
发布于 2015/06/14 21:03
字数 1041
阅读 11
收藏 0
点赞 0
评论 0
package model;

import java.util.Set;

public class Account {

	private int id;
	private String accName;
	
	//对多端对象集合的引用
	private Set<Orders> setOrders;
	
	public Account(){
		
	}

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public String getAccName() {
		return accName;
	}

	public void setAccName(String accName) {
		this.accName = accName;
	}

	public Set<Orders> getSetOrders() {
		return setOrders;
	}

	public void setSetOrders(Set<Orders> setOrders) {
		this.setOrders = setOrders;
	}
	
}

package model;

import java.util.Date;
/**
 * @author sally
 * 双向的一对多(多对一)
 * 多的一端需要对少的一端进行对象的引用
 */
public class Orders {

	private int id;
	private String orderNum;
	private Date orderTime;
	private Account account;
	
	public Orders(){
		
	}

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public String getOrderNum() {
		return orderNum;
	}

	public void setOrderNum(String orderNum) {
		this.orderNum = orderNum;
	}

	public Date getOrderTime() {
		return orderTime;
	}

	public void setOrderTime(Date orderTime) {
		this.orderTime = orderTime;
	}

	public Account getAccount() {
		return account;
	}

	public void setAccount(Account account) {
		this.account = account;
	}
	
}

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC 
	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
	"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
	<!-- name属性指定类名(全限定名) table指明表名,不指明table数据默认的表名和实体名一致 -->
    <class name="model.Account" table="acc_tab">
    	<!-- type指明当前字段的类型    name对应实体中的属性名 -->
        <id type="integer" name="id">
        	<!-- 提供ID自增的策略  native会根据数据库自行判断 -->
            <generator class="native"/>
        </id>
        <property name="accName" type="string"></property>
        <set name="setOrders">
        	<key column="acc_id"></key>
        	<!-- 配置一对多的关联映射 -->
        	<one-to-many class="model.Orders"/>
        </set>
        
    </class>	
</hibernate-mapping>

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC 
	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
	"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
	<!-- name属性指定类名(全限定名) table指明表名,不指明table数据默认的表名和实体名一致 -->
    <class name="model.Orders" table="order_tab">
    	<!-- type指明当前字段的类型    name对应实体中的属性名 -->
        <id type="integer" name="id">
        	<!-- 提供ID自增的策略  native会根据数据库自行判断 -->
            <generator class="native"/>
        </id>
        <property name="orderNum" type="string"></property>
        <property name="orderTime" type="timestamp"></property>
        <!-- 多对一关联映射 -->
        <many-to-one name="account" column="acc_id"></many-to-one>
    </class>	
</hibernate-mapping>

<!DOCTYPE hibernate-configuration PUBLIC
	"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
	"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">

<hibernate-configuration>
	<session-factory>
		<!-- 配置连接数据库的参数 -->
		<!-- 配置数据库的方言 -->
		<property name="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</property>
		<!-- 数据库驱动 -->
		<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
		<property name="hibernate.connection.url">jdbc:mysql:///2o2m</property>
		<property name="hibernate.connection.username">root</property>
		<property name="hibernate.connection.password">root</property>
		 <property name="hibernate.show_sql">true</property>
		 <!-- 其它属性配置 -->
		<!-- 指明C3P0的提供者 -->
		<property name="hibernate.connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property>
		<!-- 连接池参数的配置 -->
		<property name="hibernate.c3p0.min_size">5</property> 
	    <property name="hibernate.c3p0.max_size">30</property> 
	    <property name="hibernate.c3p0.timeout">1800</property> 
	    <property name="hibernate.c3p0.max_statements">50</property>
	    
	    <!-- 打印SQL语句到控制台 -->
		<property name="hibernate.show_sql">true</property>
		<property name="hibernate.format_sql">true</property>
		<property name="hibernate.hbm2ddl.auto">update</property> 
		<!-- 注册实体的对象关系映射文件 -->
		
		<mapping resource="model/Account.hbm.xml"/>
		<mapping resource="model/Orders.hbm.xml"/>
	</session-factory>
</hibernate-configuration>

package test;

import java.util.Date;
import java.util.HashSet;
import java.util.Set;

import model.Account;
import model.Orders;

import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.hibernate.tool.hbm2ddl.SchemaExport;
import org.junit.Test;

import util.HibernateUtils;

public class O2mTest {

	@Test
	public void createTable(){
		Configuration cfg=new Configuration().configure();
		SchemaExport se=new SchemaExport(cfg);
		se.create(true, true);
	}
	/**
	 * 先添加多的一端,再添加少的一端
	 */
	@Test
	public void save(){
		Session session=HibernateUtils.getSession();
		Transaction ts=session.beginTransaction();
		
		Orders order1=new Orders();
		order1.setOrderNum("1001");
		order1.setOrderTime(new Date());
		session.save(order1);
		
		Orders order2=new Orders();
		order2.setOrderNum("1002");
		order2.setOrderTime(new Date());
		session.save(order2);
		
		Account account=new Account();
		account.setAccName("zhangsan");
		Set<Orders> setOrders=new HashSet<Orders>();
		setOrders.add(order1);
		setOrders.add(order2);
		account.setSetOrders(setOrders);
		
		session.save(account);
		
		ts.commit();
		HibernateUtils.close(session);
	}
	/**
	 * 先添加少的一端,再添加多的一端
	 */
	@Test
	public void save1(){
		Session session=HibernateUtils.getSession();
		Transaction ts=session.beginTransaction();
		
		Account account=new Account();
		account.setAccName("lisi");
		session.save(account);
		
		Orders order1=new Orders();
		order1.setOrderNum("1003");
		order1.setOrderTime(new Date());
		order1.setAccount(account);
		session.save(order1);
		
		Orders order2=new Orders();
		order2.setOrderNum("1004");
		order2.setOrderTime(new Date());
		order2.setAccount(account);
		session.save(order2);
		
		ts.commit();
		HibernateUtils.close(session);
	}
}

双向的多对一(一对多)关系映射

对象模型:

一端:添加对多端对象集合的引用

多端:添加对一端对象的引用

关系模型:

一端:没有变化

多端:添加对一端主键的引用(建立外键关系)

关系映射文件hbm.xml的配置

在一端

<bag name="orderList">

<!-- 用key元素指定关联的外键列 -->

       <key  column="account_id" />

       <!-- 用one-to-many元素关联到多端的实体类 -->

       <one-to-many  class="com.tjitcast.model.Order" />

</bag>

在多端

<!-- 在多端配置多对一得关联映射 

在双向的多对一(一对多)关系映射中要保证引用的外键列名一致

-->

<many-to-one name="account" column="account_id"/>

注意:

建议在双向一对(多对一中)把关系交给多的一端来维护

inverse="true":反转关联关系的维护权

在一对多双向关联中,为了提高Hibernate的执行效率,应该把关系维护权交给多端。

不会影响数据的关联查询。


© 著作权归作者所有

共有 人打赏支持
萧小蚁

萧小蚁

粉丝 98
博文 279
码字总数 192339
作品 0
海淀
程序员
Hibernate映射——一对一双向关联映射(六)

我们介绍了一对一的单向关联映射,单向是指只能从人(Person)这端加载身份证端(IdCard),但是反过来,不能从身份证端加载人得信息。如图所示: 关键原因在于对象模型具有方向性: 单向:一...

architect刘源源
01/11
3
0
Java程序员从笨鸟到菜鸟之(五十四)细谈Hibernate(五)Hibernate一对多关系映射

前几篇系列博客: 细谈Hibernate(一)hibernate基本概念和体系结构 细谈Hibernate(二)开发第一个hibernate基本详解 细谈Hibernate(三)Hibernate常用API详解及源码分析 细谈Hibernate(四...

长平狐
2012/11/12
425
0
Hibernate映射——一对多关联映射(七)

一对多关联映射 映射原理 一对多关联映射和多对一的关联映射的映射原理是一致的,都是在多的一端加入一个外键,指向一的一端。关联关系都是由多端维护,只是在写映射时发生了变化。 多对一和...

architect刘源源
01/11
3
0
Hibernate映射解析——七种映射关系

首先我们了解一个名词ORM,全称是(Object Relational Mapping),即对象关系映射。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现,这样开发人员就可以把对数据库的...

universeye
2014/05/15
0
0
Hibernate系列——总结篇(九)

概念 Hibernate是一个对象关系映射框架,当然从分层的角度看,我们也说它是数据持久层的框架。 我们从上一句话可以看出Hibernate的核心:面向对象、关系映射以及数据持久化。前面两个概念很容...

architect刘源源
01/11
5
0
Hibernate框架学习之注解配置关系映射

上篇文章我们通过注解对映射了单个实体类,但是具体项目中往往实体类之间又是相互关联的,本篇文章就是从实体类之间存在的不同关联角度,具体学习下如何映射他们之间的关联,主要涉及内容如下...

Single_YAM
2017/11/15
0
0
hibernate七种对应关系映射

首先我们了解一个名词ORM,全称是(Object Relational Mapping),即对象关系映射。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现,这样开发人员就可以把对数据库的...

无敌小学僧
05/17
0
0
Hibernate-Annotation

课程地址 使用hibernate注解的目的 为了简化ORM映射文件(*.hbm)繁琐的配置。 注解需要做的是映射文件要做的。 JPA与Hibernate Java Persistence API Java持久化接口 JPA是标准接口,HIberna...

FutaoSmile丶
2017/09/28
0
0
转载---Hibernate学习三(一对多关系)

一、了解什么是一对多?      一对多这种关系用的很多,但是很多人对此模糊不清,一对多不也就是多对一吗,多对多中特殊的一个不也就是一对多吗,为什么还分的那么清楚?并且还是什么单...

废柴
02/18
0
0
Hibernate的映射

2.1、映射简介 对于所有的对象实体而言,有如下三种关系: 1:1,1:n,m:n 一种双向,一种单向。 2.2、一对多映射 多对一单向:many-to-one单向,指的是在多的这一端增加关联。 配置文件的...

pmos
2016/10/17
21
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

大数据教程(2.11):keeperalived+nginx高可用集群搭建教程

上一章节博主为大家介绍了目前大型互联网项目的系统架构体系,相信大家应该注意到其中很重要的一块知识nginx技术,在本节博主将为大家分享nginx的相关技术以及配置过程。 一、nginx相关概念 ...

em_aaron
2分钟前
0
0
Apache Directory Studio连接Weblogic内置LDAP

OBIEE默认使用Weblogic内置LDAP管理用户及组。 要整理已存在的用户及组,此前办法是导出安全数据,文本编辑器打开认证文件,使用正则表达式获取用户及组的信息。 后来想到直接用Apache Dire...

wffger
9分钟前
0
0
HFS

FS,它是一种上传文件的软件。 专为个人用户所设计的 HTTP 档案系统 - Http File Server,如果您觉得架设 FTP Server 太麻烦,那么这个软件可以提供您更方便的档案传输系统,下载后无须安装,...

garkey
13分钟前
0
0
STM 32 窗口看门狗

http://bbs.elecfans.com/jishu_805708_1_1.html https://blog.csdn.net/a1985831055/article/details/77404131...

whoisliang
昨天
0
0
Dubbo解析(六)-服务调用

当dubbo消费方和提供方都发布和引用完成后,第四步就是消费方调用提供方。 还是以dubbo的DemoService举例 -- 提供方<dubbo:application name="demo-provider"/><dubbo:registry address="z...

青离
昨天
1
0
iptables规则备份和恢复、firewalld的9个zone以及操作和service的操作

保存以及备份iptalbes规则 设定了的防火墙规则要进行保存,否则系统重启后这些规则就没有了,使用命令 ”service iptables save ” 会把设定好的防火墙规则保存到文件/etc/sysconfig/iptabl...

黄昏残影
昨天
0
0
k8s image

k8s.gcr.io/kube-apiserver-amd64:v1.11.0k8s.gcr.io/kube-controller-manager-amd64:v1.11.0k8s.gcr.io/kube-scheduler-amd64:v1.11.0k8s.gcr.io/kube-proxy-amd64:v1.11.0k8s.gcr.......

分秒
昨天
0
0
数据结构--排序

这篇博客包含了数据结构中多种的排序算法: (1)简单选择:第一趟在A[0]~A[n-1]之间找到最小的,与A[0]进行交换,之后在A[1]~A[n-1]之间进行。。。第i趟在A[i-1]~A[n-1]之间找到最小的,最后...

wangxuwei
昨天
1
0
一名3年工作经验的java程序员应该具备的职业技能

一名3年工作经验的Java程序员应该具备的技能,这可能是Java程序员们比较关心的内容。我这里要说明一下,以下列举的内容不是都要会的东西—-但是如果你掌握得越多,最终能得到的评价、拿到的薪...

老道士
昨天
3
0
MAC安装JDK

一 :在JDK官网下载对应的JDK版本 http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html 二:找到JDK安装目录,点击会出现图标,双击图标自动安装,勾选默...

WALK_MAN
昨天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部