文档章节

Hibernate 单向的一对多关联映射

萧小蚁
 萧小蚁
发布于 2015/06/14 11:31
字数 1052
阅读 19
收藏 0

单向的一对多关联关系(One to Many)

对象模型关系分析:

少的一端:会通过引用一个多端的集合对象,建立对象模型关系

多的一端:没有任何变化,不知道和少的一端存在着关系。

关系模型分析:

少的一端:没有任何变化

多的一端:会和少的一端建立外键关系

使用时需要少的一端所对应的XXX.hbm.xml中进行配置

<bag name="对多的一端对象集合的属性名称">

<!-- 用key元素指定关联的外键列,会在多的一端所对应的表中产生 -->

       <key  column="account_id" />

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

       <one-to-many  class="多的一端类的全限定名称" />

</bag>

注意:

注意:

在有映射关系的实体类中,对于普通属性会进行数据的立即加载,而对于非普通属性默认采用的是延迟加载。

可以在XXX.hbm.xml关联文件中通过指定lazy="false" 采取立即加载方式。

对延迟加载的对象也可以使用Hibernate.initialize(Object proxy);方法进行强制初始化。

package model;

/**
 * @author sally
 * 单向的多对一
 * 少的一端
 */
public class Dept {

	private int id;
	private String deptName;
	
	public Dept(){
		
	}

	public int getId() {
		return id;
	}

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

	public String getDeptName() {
		return deptName;
	}

	public void setDeptName(String deptName) {
		this.deptName = deptName;
	}
	
}
package model;

import java.util.Date;

/**
 * 
 * @author sally
 * Many to One
 * 多的一端
 */
public class Employee {

	private int id;
	private String empName;
	private Date hiredate;
	
	//对一端的引用
	private Dept dept;
	
	public Employee(){
		
	}

	public int getId() {
		return id;
	}

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

	public String getEmpName() {
		return empName;
	}

	public void setEmpName(String empName) {
		this.empName = empName;
	}

	public Date getHiredate() {
		return hiredate;
	}

	public void setHiredate(Date hiredate) {
		this.hiredate = hiredate;
	}

	public Dept getDept() {
		return dept;
	}

	public void setDept(Dept dept) {
		this.dept = dept;
	}
	
}
<?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.Dept" table="dept_tab">
    	<!-- type指明当前字段的类型    name对应实体中的属性名 -->
        <id type="integer" name="id">
        	<!-- 提供ID自增的策略  native会根据数据库自行判断 -->
            <generator class="native"/>
        </id>
        <property name="deptName" type="string"></property>
    </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.Employee" table="emp_tab">
    	<!-- type指明当前字段的类型    name对应实体中的属性名 -->
        <id type="integer" name="id">
        	<!-- 提供ID自增的策略  native会根据数据库自行判断 -->
            <generator class="native"/>
        </id>
        <property name="empName" type="string"></property>
        <property name="hiredate" type="timestamp"></property>
        <!-- 用 many-to-one 元素映射多对一关联
             name属性:指定关联的属性名
             column属性:指定此关联属性在数据库表中的外键字段名 -->
        <many-to-one name="dept" column="dept_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:///m2o</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/Dept.hbm.xml"/>
		<mapping resource="model/Employee.hbm.xml"/>
	</session-factory>
</hibernate-configuration>
package test;

import java.util.Date;

import model.Dept;
import model.Employee;

import org.hibernate.Hibernate;
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 EmployeeTest {

	@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();
		
		//在单向的多对一中,要先添加少的一端
		Dept dept=new Dept();
		dept.setDeptName("财务部");
		session.save(dept);
		
		Employee emp=new Employee();
		emp.setEmpName("zhangsan");
		emp.setHiredate(new Date());
		emp.setDept(dept);
		session.save(emp);
		
		ts.commit();
		HibernateUtils.close(session);
	}
	
	@Test
	public void get(){
		Session session=HibernateUtils.getSession();
		Transaction ts=session.beginTransaction();
		
		Employee emp=(Employee)session.get(Employee.class, 1);
		System.out.println(emp.getEmpName()+"---->"+emp.getHiredate());
		Hibernate.initialize(emp.getDept());
		//Dept dept=emp.getDept();
		//System.out.println(dept.getId()+"-->"+dept.getDeptName());
		ts.commit();
		HibernateUtils.close(session);
	}
	
}
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();
		}
		
	}
	
}


© 著作权归作者所有

共有 人打赏支持
萧小蚁

萧小蚁

粉丝 98
博文 279
码字总数 192339
作品 0
海淀
程序员
Java程序员从笨鸟到菜鸟之(五十四)细谈Hibernate(五)Hibernate一对多关系映射

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

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

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

architect刘源源
01/11
3
0
Hibernate系列——总结篇(九)

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

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

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

universeye
2014/05/15
0
0
hibernate七种对应关系映射

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

无敌小学僧
05/17
0
0

没有更多内容

加载失败,请刷新页面

加载更多

springboot 上传图片(多张和单张都可以)

@RequestMapping("/upload")@ResponseBodypublic String handleFileUpload(HttpServletRequest request) { MultipartHttpServletRequest params = ((MultipartHttpServletRequest) req......

MrBoyce
7分钟前
1
0
Android Studio 3.X打开DDMS

Android Studio更新到3.0版本以后Tools菜单变成了这样了 DDMS入口找不到了 在设置里找到SDK的路径 打开tools文件夹 双击打开 monitor.bat文件 会出来一个黑色命令行框,稍等一下,熟悉的DDM...

lanyu96
11分钟前
1
0
js 进一法、四舍五入法、舍去法 保留两位小数

function format_number(num,len) { len = len > 0 && len <= 20 ? len : 2; var result = parseFloat(num); num=isNaN(result)?0:result; var numpow=Math.pow(10,len)......

xiaogg
18分钟前
0
0
Node.js中的不安全跳转如何防御详解

Node.js中的不安全跳转如何防御详解 导语: 早年在浏览器大战期间,有远见的Chrome认为要运行现代Web应用,浏览器必须有一个性能非常强劲的Java引擎,于是Google自己开发了一个高性能的开源的...

开元中国2015
19分钟前
1
0
国内首个区块链试验区在海南成立

据新华社报道,10月8日,海南自贸区(港)区块链试验区正式在海南生态软件园授牌设立,这也是目前为止国内第一个区块链试验区。 该试验区位于海南生态软件园,与试验区同一天成立还有2家研究...

问题终结者
21分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部