十二 集合映射之Map集合

十二 Map集合映射
Map是以键值对的形式存放数据的 

现在我们假设员工数据的name为唯一的 
现在我们来看映射文件
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC 
	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping 
	package="vo.util.bean">

	<class name="Employee">
		<id name="id">
			<generator class="native"/>
		</id>
		<property name="name" unique="true"/>
		<many-to-one name="derpartment" column="depaer_id" not-null="true"/>
	</class>
	
</hibernate-mapping>

unique是定义其为唯一键的约束 

员工实体类

package vo.util.bean;
/**
 * 员工类
 * @author Administrator
 *
 */
public class Employee {
    private int id;
    private String name;
    private Department derpartment;
	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 Department getDerpartment() {
		return derpartment;
	}
	public void setDerpartment(Department derpartment) {
		this.derpartment = derpartment;
	}
	@Override
	public String toString() {
		// TODO Auto-generated method stub
		return "id="+this.id+" name="+this.name;
	}
	
}


现在我们来定义部门实体
package vo.util.bean;

import java.util.Map;


/**
 * 部门类
 * @author Administrator
 *
 */
public class Department {
  private int id;
  private String name;
  private Map<String,Employee> ems;
  
public Map<String, Employee> getEms() {
	return ems;
}

public void setEms(Map<String, Employee> ems) {
	this.ems = ems;
}

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;
}
}



这行是定义Map集合的 
private Map<String,Employee> ems;


映射文件 
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC 
	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping 
	package="vo.util.bean">

	<class name="Department">
		<id name="id">
			<generator class="native"/>
		</id>
		<property name="name"/>
		<!-- 配置一对多的映射关系  -->
		<!-- 
		<set name="ems">
		 -->
		<!-- 关联关系的外键  -->
		<!--  
		<key column="depaer_id"/>
		-->
		   <!-- 关联关系的实体类配置 -->
		   <!-- 
		  <one-to-many  class="Employee" />
		</set>
		
		 -->
        <map name="ems">
        <key column="depaer_id"/>
		 <map-key type="string" column="name"/>
		 <one-to-many class="Employee"/>
		 </map>
	</class>
	
</hibernate-mapping>

分析 发现这跟List并没有太大的区别 其实map节点的里面字段属性意义都是一样的
就<map-key 这个节点有特殊之处 这是指定其键的 因为Map是以键值对的形式存在的 
type是指定键的类型 当前指定为string类型 这个column是干什么用的呢?这个是指定
其键的值是以那个列为键的 当前是以员工的name这个列作为键存在的 

测试类

package vo.util.test;

import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;

import org.hibernate.Session;
import org.hibernate.Transaction;

import vo.util.HibernateUtil;
import vo.util.bean.Department;
import vo.util.bean.Employee;

public class OneToMany {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
	
         add();
        query(1);
	}
    static Department add(){
    	Session session = null;
    	Transaction tx = null;
    	try{
    		session =HibernateUtil.getSession();
    		tx = session.beginTransaction();
    		//…你的代码save,delete,update,get…
    		Department dpart=new Department();
    		dpart.setName("政企事业部");
    		
    		Employee em1=new Employee();
    		em1.setName("员工李小仙");
    		em1.setDerpartment(dpart);
    		
    		Employee em2=new Employee();
    		em2.setName("员工张小三");
    		em2.setDerpartment(dpart);
    		
    		Map<String,Employee> ems=new HashMap<String, Employee>();
    	    ems.put(em1.getName(), em1);
    	    ems.put(em2.getName(), em2);
    	    
    	    dpart.setEms(ems);    
    		session.save(dpart);
    		session.save(em1);
    		session.save(em2);
    		
    		
    		tx.commit();
    		return dpart;
    	}finally{
    		if(session != null)session.close();
    	} 

    }
    
    static Department query(int id){
    	Session session=null;
    	
    	try{
    	   session=HibernateUtil.getSession();
    	   Department d=(Department)session.get(Department.class, id);
    	   
    	   System.out.println(d.getEms());
    	  
    		return d;
    	}finally{
    		if(session != null)session.close();
    	} 

    }
}


通过输出发现:输出是键值对的形式输出的 

end 完毕!

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值