Hibernate中在持久化的类中定义的集合类的映射方法介绍和小注意

    技术2026-04-05  1

    类的映射文件中用于表示集合的标签:class1:Department 本类class2:Employee

    一.set:表示此属性的类型为Set

    <set name="emps"> <!-- key标签表示数据库查找Employee的条件字段名称 ,或者可以说是 两个表连接的外键名称 --> <key column="depart_id"/> <! -- 指定此类当前属性的类型 -- > <one-to-many class="Employee"/> </set>   二.list:表示此属性的类型为Listlist标签的特点:查询出的数据会按照插入的顺序出现,具体的操作方法是在表中添加一个自动增长的字段(例如下面的<index/>标签,column属性表示字段名称)用于记录插入的顺序,查询的时候按照此字段排序<list name="emps"> <!-- key标签表示数据库查找Employee的条件字段名称 ,或者可以说是 两个表连接的外键名称 --> <key column="depart_id"/> <!-- index标签用于记录插入数据的索引(按照插入的先后,从0开始) --> <index column="order_col"/> <! -- 指定此类当前属性的类型 -- > <one-to-many class="Employee"/> </list> -->    

    三.bag:类似于list标签bag标签的特点:如果使用bag标签,跟list差不多,那此类的当前属性只能是List,但是此标签的内部没有<index/>标签,不能创建记录顺序的那一列  <bag name="emps"> <key column="depart_id"/> <one-to-many class="Employee"/> </bag>

    四.map:此属性类型为Mapmap标签的特点:具有key和value的键值对,并且需要指定key的类型和列名 <map name="emps"> <key column="depart_id"/> <map-key type="string" column="name"/> <one-to-many class="Employee"/> </map>

    五.此类的属性为数组类型此类型的配置跟list类似

    以上多种数据类型的使用规则:一般情况下就会使用Set,因为Set的配置相对简单一些,并且插入的是不重复的数据 如果要使用List,就要看有什么需求了:  1.如果要使用List集合,但是又不想让Hibernate定义一列来记录顺序,就可以在类的属性  使用List,映射的时候使用bag标签实现  2.如果要保存顺序,就要用List来映射了,类的类型是List,映射也用list

    如果需求中需要使用键值对的方式存放数据就要使用map了而数组的使用就会更少了,因为数组的这种数据结构对于元素的变化操作就不是很方便,并且会经常发生下表越界这种异常 =================================================================================另外在使用Set的时候的一些小注意:static Department add(){ Session s=null; Transaction tran=null; try{ Department depart1=new Department(); depart1.setName("depart name1"); Employee emp1=new Employee(); emp1.setDepart(depart1);//对象模型:建立两个对象的关联 emp1.setName("employee name1"); Employee emp2=new Employee(); emp2.setDepart(depart1);//对象模型:建立两个对象的关联 emp2.setName("employee name2"); ******************此代码************************* *Set<Employee> emps=new HashSet<Employee>(); * ************************************************ depart1.setEmps(emps); s=HibernateUtil.getSession(); tran=s.beginTransaction(); s.save(depart1); s.save(emp1); s.save(emp1); tran.commit(); return depart1; }catch(HibernateException e){ if(tran!=null){ tran.rollback(); } throw e; }finally{ if(s!=null){ s.close(); } } }   

    如上面的一个方法用于添加员工(Employee)的信息和部门(Department)信息被*包围的代码所示,把得到的Set类型的数据又转换成了Set的实现类HashSet来保存,这样的话再经过Hibernate中Session的save方法,就会出现异常,原因是:如果不转换成为HashSet类型数据,原来的Set类型的数据经过Hibernate之后会被转换城为另一种数据类型org.Hibernate.collection.PersistentSet来保存,其中org.Hibernate.collection.PersistentSet是jdk中Set类型的实现类,而HashSet也是其实现类,那平级的数据类型相互转换当然会出现异常的.当然类的属性类型更不能用HashSet了得出的结论:在持久化的类中定义的集合类要定义成接口,不要定义成具体的实现类,就不会出现问题了

    最新回复(0)