十二 会合映射之Map集合
十二 集合映射之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 完毕!