文档章节

Hibernate 双向的多对一关联映射

萧小蚁
 萧小蚁
发布于 2015/06/14 21:03
字数 1041
阅读 11
收藏 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的执行效率,应该把关系维护权交给多端。

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


萧小蚁

萧小蚁

粉丝 101
博文 279
码字总数 192339
作品 0
海淀
程序员
私信 提问
加载中
请先登录后再评论。
Swing界面分析和调试工具--Swing Inspector

Swing Inspector是一个Java Swing/AWT用户界面分析和调试工具,功能与firebug类似,具有强大的Swing/AWT用户界面分析和调试相关功能。 适用于从java swing初级到高级的所有开发人员,能够快速...

匿名
2013/03/06
3.4K
0
硬实时操作系统--Raw OS

Raw-OS 起飞于2012年,Raw-OS志在制作中国人自己的最优秀硬实时操作系统。 Raw-OS 操作系统特性 内核最大关中断时间无限接近0us, s3c2440系统最大关中断时间实测0.8us。 支持idle任务级别的事...

jorya_txj
2013/03/19
6.3K
1
游戏引擎--DarkGDK

Dark游戏开发工具包是一个完整的游戏引擎技术利用最新DirectX 9.0。 微软公司制作的编游戏的链接库工具,专门配合Visual C++ 2008 Express 和 DirextX 9.0 SDK,可以编辑制作3D,2D游戏,制作...

匿名
2013/04/01
2.2K
0
高效 Java Web 开发框架--JessMA

JessMA 是功能完备的高性能 Full-Stack Web 应用开发框架,内置可扩展的 MVC Web 基础架构和 DAO 数据库访问组件(内部已提供了 Hibernate、MyBatis 与 JDBC DAO 组件),集成了 Action 拦截...

伤神小怪兽
2012/11/13
9.2K
3
Fluent nHibernate

对nHibernate的封装。 特点 无XML映射文件 (.hdm.xml) 流畅接口 流程C#配置nHibernate 流畅C#映射,甚至自动映射。 强类新映射,减少类新匹配错误 * 数据库的重构,变得更容易 Fluent nHibe...

匿名
2012/11/29
3.3K
2

没有更多内容

加载失败,请刷新页面

加载更多

汇总一下 Intellij IDEA 常用的牛逼插件!

来源:blog.csdn.net/sunny243788557/java/article/details/106011723 1、日晒主题 Solarized Themes 2、idea上 类调用时序图 SequenceDiagram for IntelliJ IDEA 3、彩色括号 Rainbow Brac......

路人甲Java
昨天
22
0
StringBuider 在什么条件下、如何使用效率更高?

点击上方“方志朋”,选择“设为星标” 回复”666“获取新整理的面试文章 作者:后青春期的Keats cnblogs.com/keatsCoder/p/13212289.html 引言 都说 StringBuilder 在处理字符串拼接上效率要...

方志朋
昨天
7
0
预告|悬镜子芽:新一代灰盒安全测试技术实践分享

点击蓝字 关注我们 万物皆有法,方能有序运行。网络安全进化到内生安全时代,以框架为起点,规划全景,技术内生外长,不断叠加,形成新一代网络安全之道。2020北京网络安全大会(BCS2020)已...

悬镜
昨天
0
0
zoom免费用户无法在中国登陆,RHUB免费续航zoom

中美关系日趋紧张,许多产品强制要求用户站队,zoom已经做了选择,抛弃众多信任、认可zoom产品的用户。微软选择坚持为中国用户提供服务,谁又说得来明天会如何?我们如此泱泱大国,竟要受制于...

osc_gt7nq50v
27分钟前
19
0
kubernetes 安装笔记

ssh -p 9000 root@127.0.0.1 192.168.56.101 master-node 192.168.56.102 work-node1 192.168.56.103 work-node2 由于kubeadm 默认从官网k8s.grc.io下载所需镜像,国内无法访问,因此需要通过......

solate
28分钟前
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部