十二 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 完毕!