【7.6.1】基于map集合映射

1.Grade类和Student类:

package cn.siggy.pojo;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class Grade {
	private int id;
	private String name;
	private Map<String,Student> students = new HashMap<String,Student>(0);
	/*get/set*/
}


package cn.siggy.pojo;

public class Student {
	private int id;
	private String name;
	private int age;
	/*get/set*/
}

  

2.映射文件

Grade.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="cn.siggy.pojo">
	<class name="Grade">
		<id name="id">
			<generator class="native"></generator>
		</id>
		<property name="name"/>
		<map name="students" cascade="all">
			<!-- key表示外键 -->
			<key column="grade_id"/>
			<!-- map-key是映射为map集合时,对应key值 [colum=name], key值建议为唯一 -->
			<map-key type="string" column="name"/>
			<one-to-many class="Student"/>
		</map>
	</class>
</hibernate-mapping>

  

Student.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="cn.siggy.pojo">
	<class name="Student">
		<id name="id" column="id">
			<generator class="native"></generator>
		</id>
		<property name="name"/>
		<property name="age"/>
	</class>
</hibernate-mapping>

  

3.测试代码

package cn.siggy.test;

import java.sql.SQLException;
import java.util.Map;

import javax.sql.rowset.serial.SerialException;

import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.cfg.Configuration;
import org.hibernate.tool.hbm2ddl.SchemaExport;
import org.junit.Test;

import cn.siggy.pojo.Grade;
import cn.siggy.pojo.Student;
import cn.siggy.util.HibernateUtil;

public class HibernateTest {
	@Test
	public void testCreateDB(){
		Configuration cfg = new Configuration().configure();
		SchemaExport se = new SchemaExport(cfg);
		//第一个参数 是否生成ddl脚本  第二个参数  是否执行到数据库中
		se.create(true, true);
	}
	@Test
	public void testSave() throws HibernateException, SerialException, SQLException{
		Configuration cfg = new Configuration().configure();
		SessionFactory factory = cfg.buildSessionFactory(new StandardServiceRegistryBuilder()
		.applySettings(cfg.getProperties()).build());
		Session session = null;
		Transaction tx = null;
		try{
			session = factory.openSession();
			tx = session.beginTransaction();
			Grade grade = new Grade();
			grade.setName("基础");
			
			Student stu = new Student();
			stu.setName("张三疯");
			stu.setAge(22);
			Student stu1 = new Student();
			stu1.setName("老王");
			stu1.setAge(23);
			Student stu2 = new Student();
			stu2.setName("老李");
			stu2.setAge(23);
			//关联
			grade.getStudents().put(stu.getName(), stu);
			grade.getStudents().put(stu1.getName(), stu1);
			grade.getStudents().put(stu2.getName(), stu2);
			//保存数据的顺序 是根据外键的配置来决定的
			//如果外键不能为null,那么先保存一的一端
			//如果外键可以为null,则可以随意保存
			session.save(grade);
			session.save(stu);
			session.save(stu1);
			session.save(stu2);
			
			tx.commit();
			
		}catch (HibernateException e) {
			if(tx!=null)
				tx.rollback();
			e.printStackTrace();
			throw e;
		}finally{
			HibernateUtil.closeSession();
		}
	}
	@Test
	public void testGet(){
		Session session = null;
		Transaction tx = null;
		try{
			session = HibernateUtil.getSession();
			tx = session.beginTransaction();
			//取数据
			Grade grade = (Grade)session.get(Grade.class, 1);
			System.out.println("gradeName="+grade.getName());
			System.out.println("grade所对应的多的一端的数据");
			Map<String,Student> map = grade.getStudents();
			System.out.println(map.get("老王").getAge());
			tx.commit();
		}catch (HibernateException e) {
			if(tx!=null)
				tx.rollback();
			e.printStackTrace();
			throw e;
		}finally{
			HibernateUtil.closeSession();
		}
	}
}

  

4.测试结果

1.执行testSave()方法:

 

2.执行testGet()方法:

 

posted @ 2017-04-08 14:05  chxbar  阅读(134)  评论(0编辑  收藏  举报