Hibernate的执行流程和集合的映射关系

Hibernate的执行流程


集合映射

准被hibernate的运行环境

配置hibernate.cfg.xml主配置文件

1、Set集合

写User.java类

package com.gqx.collection;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
/**
 * javaBean的设计
 * @author 郭庆兴
 *
 */
public class User {

	private int userId;
	private String userName;
	//一个用户对应多个地址
	private Set<String> address;

	public int getUserId() {
		return userId;
	}
	public void setUserId(int userId) {
		this.userId = userId;
	}
	public String getUserName() {
		return userName;
	}
	public void setUserName(String userName) {
		this.userName = userName;
	}
	public Set<String> getAddress() {
		return address;
	}
	public void setAddress(Set<String> address) {
		this.address = address;
	}

}

映射文件User.hbm.xml

<?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  package="com.gqx.collection">

	<class name="User" table="t_users">
		<!-- 主键字段 -->
		<id name="userId" column="id">
			<generator class="native"/>
		</id>
		<property name="userName" ></property>
		<!-- set集合属性的映射,指定要映射的set集合的属性
			 table 集合属性要映射到的表
			 key 指定属性集合表(t_address)的外键字段
			 element 指定集合表的其他字段-->
		<set name="address" table="t_address">
			<key column="uid"></key>
			<element column="address" type="string"></element>
		</set>

	</class>

</hibernate-mapping>

测试类如下:

public class App {
	private static SessionFactory sf;
	static{
		sf=new Configuration().configure().addClass(User.class).buildSessionFactory();
	}
	/**
	 * Set集合
	 */
	@Test
	public void test() {
		Session session=sf.openSession();
		session.beginTransaction();

		//**************保存************
		Set<String> addressSet=new HashSet<String>();
		addressSet.add("黄石");
		addressSet.add("荆州");
		User user=new User();
		user.setAddress(addressSet);
		user.setUserName("gqxing");
		session.save(user);
		session.getTransaction().commit();
		session.close();
	}
}

2、List集合User.java

package com.gqx.collection;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
/**
 * javaBean的设计
 * @author 郭庆兴
 *
 */
public class User {

	private int userId;
	private String userName;
	//一个用户对应多个地址
	private List<String> addressList=new ArrayList<String>();

	public void setAddressList(List<String> addressList) {
		this.addressList = addressList;
	}
	public List<String> getAddressList() {
		return addressList;
	}
	public int getUserId() {
		return userId;
	}
	public void setUserId(int userId) {
		this.userId = userId;
	}
	public String getUserName() {
		return userName;
	}
	public void setUserName(String userName) {
		this.userName = userName;
	}

}

映射文件(User.hbm.xml)

<?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  package="com.gqx.collection">

	<class name="User" table="t_users">
		<!-- 主键字段 -->
		<id name="userId" column="id">
			<generator class="native"/>
		</id>
		<property name="userName" ></property>

		<!-- List集合
			list-index:指定的是集合排列的顺序(因为要保证List集合的有序)
		 -->
		 <list name="addressList" table="t_addressList">
		 	<key column="uid"></key>
		 	<list-index column="idx"></list-index>
		 	<element column="address" type="string"></element>
		 </list>

	</class>

</hibernate-mapping>

测试类:

    /**
	 * List集合
	 */
	@Test
	public void testSaveList() {
		Session session=sf.openSession();
		session.beginTransaction();

		//**************保存************
		User user=new User();
		user.setUserName("gqxing");
		user.getAddressList().add("武汉");
		user.getAddressList().add("上海");
		session.save(user);
		session.getTransaction().commit();
		session.close();
	}

3、Map集合

User.java

package com.gqx.collection;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
/**
 * javaBean的设计
 * @author 郭庆兴
 *
 */
public class User {

	private int userId;
	private String userName;
	//一个用户对应多个地址
	private Map<String, String> addressMap=new HashMap<String, String>();

	public void setAddressMap(Map<String, String> addressMap) {
		this.addressMap = addressMap;
	}
	public Map<String, String> getAddressMap() {
		return addressMap;
	}
	public int getUserId() {
		return userId;
	}
	public void setUserId(int userId) {
		this.userId = userId;
	}
	public String getUserName() {
		return userName;
	}
	public void setUserName(String userName) {
		this.userName = userName;
	}

}

映射文件

<?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  package="com.gqx.collection">

	<class name="User" table="t_users">
		<!-- 主键字段 -->
		<id name="userId" column="id">
			<generator class="native"/>
		</id>
		<property name="userName" ></property>

		 <!--
		 	map集合映射
		 	key:指定外键字段
		 	map-key:指定map的key
		 	element:指定map的value
		  -->
		  <map name="addressMap" table="t_addressMap">
		  	<key column="uid"></key>
		  	<map-key type="string" column="shortName"></map-key>
		  	<element column="address" type="string"></element>
		  </map>
	</class>

</hibernate-mapping>

测试类

    /**
	 * List集合
	 */
	@Test
	public void testSaveMap() {
		Session session=sf.openSession();
		session.beginTransaction();

		//**************保存************
		User user=new User();
		user.setUserName("gqxing");
		user.getAddressMap().put("A002", "黄石");
		user.getAddressMap().put("A001", "荆州");
		session.save(user);
		session.getTransaction().commit();
		session.close();
	}


集合的获取

测试类

    /**
	 * 获取
	 */
	@Test
	public void testGet() {
		Session session=sf.openSession();
		session.beginTransaction();

		//获取
		User user=(User)session.get(User.class, 2); //及时加载
		System.out.println(user.getUserId());
		System.out.println(user.getUserName());
		//当查询用户,可以获取与亲关联的list集合的数据(因为有正确的映射)
		//当遇到到集合数据的使用时,才向数据库发送执行的sql语句(懒加载)
		System.out.println(user.getAddressList());
		session.getTransaction().commit();
		session.close();
	}
时间: 2024-12-24 04:56:23

Hibernate的执行流程和集合的映射关系的相关文章

Hibernate多对一,多对多的表映射关系

版权声明:本文为博主原创文章,未经博主允许不得转载. 本文旨在介绍hibernate的实体与数据库表的各种关系映射 1.多对一/一对多关系映射 User-------用户表 Department -------------部门表 Contact---------------组件部分,(地址类)) 下面开始各实体代码: User.java实体类 package com.huangchao.model; import java.io.Serializable; import java.util.Da

【Hibernate步步为营】--最后的集合映射

上篇文章详细讨论了组合对象映射的原理,它其实指的是如何将对象模型中的组合关系映射到关系模型中,它是通过使用Hibernate提供的<component>标签来实现的,并需要在该标签中添加对应组合对象的属性,有关组合对象的映射请查看笔者的上篇文章.该篇文章来详细讨论下集合的映射关系,Java的集合有四种分别是Set.Map.List和普通集合,在开发时往往需要将这些集合转化为对应的关系模型,这种集合映射的实现过程就是我们今天要讨论的话题. 一.集合映射 1.1 集合小介 集合映射也是基本的映射,

hibernate 映射关系—集合映射

1.集合映射简介 当持久化类中有一个值类型的集合,那么就需要一张额外的数据库表来保存这个值类型集合的数据,这张表被称为集合表.比如有一张学生表,学生可能有很多爱好,就需要一种学生爱好集合表来存储学生的爱好信息. Hibernate支持大部分重要的JDK集合接口映射,主要有以下几种. 1. set 可以映射类型为java.util.Set接口的属性,它的元素存放没有顺序且不允许重复:也可映射类型为java.util.SortSet接口的属性.它的元素可以按自然顺序排列. 2. list 可以映射类

SSH(Struts2+Spring+Hibernate)框架搭建流程&lt;注解的方式创建Bean&gt;

此篇讲的是MyEclipse9工具提供的支持搭建自加包有代码也是相同:用户登录与注册的例子,表字段只有name,password. SSH,xml方式搭建文章链接地址:http://www.cnblogs.com/wkrbky/p/5912810.html 一.Hibernate(数据层)的搭建: 实现流程 二.Spring(注入实例)的使用: 实现流程 三.Struts2(MVC)的搭建: 实现流程 这里注意一点问题: Struts2与Hibernate在一起搭建,antlr包,有冲突.MyE

ASP.NET MVC4 执行流程

MVC在底层和传统的asp.net是一致的,在底层之上,相关流程如下: 1)Global.asax里,MvcApplication对象的Application_Start()事件中,调用 RouteConfig.RegisterRoutes(RouteTable.Routes); 来注册路由规则. 2)RouteConfig.RegisterRoutes()方法里,给出的默认规则为 {controller}/{action}/{id} . a. 在有特别需要的时候,到这里来修改规则. b. 未指

Hibernate—— 一对多 和 多对多关联关系映射(xml和注解)总结(转载)

One to Many 映射关系 多对一单向外键关联(XML/Annotation) 一对多单向外键关联(XML/Annotation) 懒加载和积极加载 一对多双向外键关联(XML/Annotation) Many to Many 映射关系 多对多单向外键关联(XML/Annotation) 多对多双向外键关联(XML/Annotation) set的inverse元素详解 问题小结 关联关系的优缺点 多对一单向外键关联关系 注意多对一关联是多方持有一方的引用.看一个例子,去淘宝购物,那么一个

Hibernate 映射关系

映射组成关系 •建立域模型和关系数据模型有着不同的出发点: –域模型: 由程序代码组成, 通过细化持久化类的的粒度可提高代码的可重用性, 简化编程 –在没有数据冗余的情况下, 应该尽可能减少表的数目, 简化表之间的参照关系, 以便提高数据的访问速度 •Hibernate 把持久化类的属性分为两种: –值(value)类型: 没有 OID, 不能被单独持久化, 生命周期依赖于所属的持久化类的对象的生命周期 –实体(entity)类型: 有 OID, 可以被单独持久化, 有独立的生命周期 •显然无法

Hibernate(三) 之 映射关系

一.概念: 关系:名词,事物之间相互作用.相互联系的状态. 关联:名词:表示对象(数据库表)之间的关系:动词:将对象(数据库表)之间通过某种方式联系起来. 映射:将一种形式转化为另一种形式,包括关系. 级联:动词,有关系的双方中操作一方,另一方也将采取一些动作. 值类型:对象不具备数据库同一性,属于一个实体实例其持久化状态被嵌入到所拥有的实体的表行中,没有标识符. 实体类型:具有数据库标识符. 二.数据库: 1.关系 2.1.1.一对一.一对多.多对多 2.1.2.如何表示? 外键+索引 2.级

java框架篇---hibernate(一对多)映射关系

一对多关系可以分为单向和双向. 一对多关系单向 单向就是只能从一方找到另一方,通常是从主控类找到拥有外键的类(表).比如一个母亲可以有多个孩子,并且孩子有母亲的主键作为外键.母亲与孩子的关系就是一对多的关系.如果想对母亲信息的操作同时也反应在其孩子信息上那么可以在母亲类配置文件的集合属性上配置cascade="all",表示对关联实体进行级联更新配置. “主”端: 多的一端 <?xml version="1.0"?> <!DOCTYPE hiber