文档章节

Hibernate 双向的自身关联映射

萧小蚁
 萧小蚁
发布于 2015/06/14 22:38
字数 882
阅读 9
收藏 0
点赞 0
评论 0
双向的多对一(一对多)关系映射
	对象模型:
	一端:添加对多端对象集合的引用
	多端:添加对一端对象的引用
	关系模型:
	一端:没有变化
	多端:添加对一端主键的引用(建立外键关系)
	
	关系映射文件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的执行效率,应该把关系维护权交给多端。
		不会影响数据的关联查询。



package model;

import java.util.Set;

/**
 * @author sally
 * 双向的一对多或多对一 自身关联
 */
public class Category {

	private int id;
	private String name;
	//如果把Category看成是多的一端
	private Category parent;
	//如果把Category看成是少的一端,则需要对多的一端进行对象集合的引用
	private Set<Category> clist;
	
	public Category(){
		
	}

	public int getId() {
		return id;
	}

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

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public Category getParent() {
		return parent;
	}

	public void setParent(Category parent) {
		this.parent = parent;
	}

	public Set<Category> getClist() {
		return clist;
	}

	public void setClist(Set<Category> clist) {
		this.clist = clist;
	}
	
}
<?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.Category" table="cate_tab">
    	<!-- type指明当前字段的类型    name对应实体中的属性名 -->
        <id type="integer" name="id">
        	<!-- 提供ID自增的策略  native会根据数据库自行判断 -->
            <generator class="native"/>
        </id>
        <property name="name" type="string"></property>
        <set name="clist" inverse="true">
        	<key column="parent_id"></key>
        	<!-- 配置一对多的关联映射 -->
        	<one-to-many class="model.Category"/>
        </set>
        <many-to-one name="parent" column="parent_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:///2o2mzishen</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/Category.hbm.xml"/>
		
	</session-factory>
</hibernate-configuration>
package util;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

public class HibernateUtils {

	private static SessionFactory factory;
	static{
		factory=new Configuration().configure().buildSessionFactory();
	}
	public static SessionFactory getFactory(){
		return factory;
	}
	
	public static Session getSession(){
		return factory.openSession();
	}
	
	public static void close(Session session){
		if(session!=null){
			session.close();
		}
		
	}
	
}
package test;


import model.Category;

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();
		
		//添加一级分类
		Category c1=new Category();
		c1.setName("计算机");
		session.save(c1);
		
		//添加二级分类
		Category c2=new Category();
		c2.setName("软件开发");
		c2.setParent(c2);
		session.save(c2);
		
		//添加二级分类
		Category c3=new Category();
		c3.setName("硬件维修");
		c3.setParent(c3);
		session.save(c3);
		
		ts.commit();
		HibernateUtils.close(session);
	}
	/**
	 * 先添加少的一端,再添加多的一端
	 */
	@Test
	public void save1(){
		Session session=HibernateUtils.getSession();
		Transaction ts=session.beginTransaction();
		
		
		
		ts.commit();
		HibernateUtils.close(session);
	}
}


© 著作权归作者所有

共有 人打赏支持
萧小蚁

萧小蚁

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

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

architect刘源源
01/11
3
0
深入理解Hibernate

映射一对多关联关系 一对多双向关联关系映射 例子 用户与订单关系 customer表和order表 order表有个一个字段是customerid 那么在用户的entity中就存在一个set来存放订单 在 订单 的entity中有...

嘿嘿!!
2016/09/16
0
0
Hibernate系列——总结篇(九)

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

architect刘源源
01/11
5
0
Hibernate映射——一对多关联映射(七)

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

architect刘源源
01/11
3
0
java.lang.StackOverflowError异常解决

在hibernate一对多映射中,两个实体都重写了toString()方法,,应用程序递归太深了,所以发生了堆栈溢出。解决方法就是将多的一方对象里面重写的toString方法去掉,或者两个对象里面重写的t...

大黄有故事
2016/11/05
0
0
收集:Hibernate中常见问题 No row with the given identifier

产生此问题的原因: 有两张表,table1和table2.产生此问题的原因就是table1里做了关联<one-to-one>或者<many-to-one unique="true">(特殊的多对一映射,实际就是一对一)来关联table2.当hiberna...

土鳖的弟弟
2014/03/22
0
0
Hibernate框架学习之注解配置关系映射

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

Single_YAM
2017/11/15
0
0
Java程序员从笨鸟到菜鸟之(五十四)细谈Hibernate(五)Hibernate一对多关系映射

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

长平狐
2012/11/12
425
0
NHibernate从入门到精通系列(9)——一对多关联映射

内容摘要 单向关联映射 双向关联映射 一、单向关联映射 1.1 单向关联映射的描述 让我们回顾一下之前讲的《多对一关联映射》,如图1.1.1所示,其实“一对多”关联映射就是“多对一”关联映射相...

长平狐
2012/06/11
306
0
Hibernate-Annotation

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

FutaoSmile丶
2017/09/28
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Java架构师知识体认识

源码分析 常用设计模式 Proxy代理模式 Factory工厂模式 Singleton单例模式 Delegate委派模式 Strategy策略模式 Prototype原型模式 Template模板模式 Spring5 beans 接口实例化 代理Bean操作 ...

小致dad
16分钟前
0
0
SpringBoot | 第十章:Swagger2的集成和使用

前言 前一章节介绍了mybatisPlus的集成和简单使用,本章节开始接着上一章节的用户表,进行Swagger2的集成。现在都奉行前后端分离开发和微服务大行其道,分微服务及前后端分离后,前后端开发的...

oKong
今天
9
0
Python 最小二乘法 拟合 二次曲线

Python 二次拟合 随机生成数据,并且加上噪声干扰 构造需要拟合的函数形式,使用最小二乘法进行拟合 输出拟合后的参数 将拟合后的函数与原始数据绘图后进行对比 import numpy as npimport...

阿豪boy
今天
12
0
云拿 无人便利店

附近(上海市-航南路)开了家无人便利店.特意进去体验了一下.下面把自己看到的跟大家分享下. 经得现场工作人员同意后拍了几张照片.从外面看是这样.店门口的指导里强调:不要一次扫码多个人进入....

周翔
昨天
1
0
Java设计模式学习之工厂模式

在Java(或者叫做面向对象语言)的世界中,工厂模式被广泛应用于项目中,也许你并没有听说过,不过也许你已经在使用了。 简单来说,工厂模式的出现源于增加程序序的可扩展性,降低耦合度。之...

路小磊
昨天
203
1
npm profile 新功能介绍

转载地址 npm profile 新功能介绍 npm新版本新推来一个功能,npm profile,这个可以更改自己简介信息的命令,以后可以不用去登录网站来修改自己的简介了 具体的这个功能的支持大概是在6这个版...

durban
昨天
1
0
Serial2Ethernet Bi-redirection

Serial Tool Serial Tool is a utility for developing serial communications, custom protocols or device testing. You can set up bytes to send accordingly to your protocol and save......

zungyiu
昨天
1
0
python里求解物理学上的双弹簧质能系统

物理的模型如下: 在这个系统里有两个物体,它们的质量分别是m1和m2,被两个弹簧连接在一起,伸缩系统为k1和k2,左端固定。假定没有外力时,两个弹簧的长度为L1和L2。 由于两物体有重力,那么...

wangxuwei
昨天
0
0
apolloxlua 介绍

##项目介绍 apolloxlua 目前支持javascript到lua的翻译。可以在openresty和luajit里使用。这个工具分为两种模式, 一种是web模式,可以通过网页使用。另外一种是tool模式, 通常作为大规模翻...

钟元OSS
昨天
2
0
Mybatis入门

简介: 定义:Mybatis是一个支持普通SQL查询、存储过程和高级映射的持久层框架。 途径:MyBatis通过XML文件或者注解的形式配置映射,实现数据库查询。 特性:动态SQL语句。 文件结构:Mybat...

霍淇滨
昨天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部