Hibernate映射Map
来源:互联网 发布:火车头采集数据导出 编辑:程序博客网 时间:2024/05/23 19:19
Hibernate映射Map,比较简单的情况就是Map<key,value>的value为String、Long、Date等Hibernate支持的类,较为复杂的就是自定义的类。下面介绍映射Map时这两种情况,至于更加复杂的情况以后再说。
以Team类为例:
1.简单情况:Team中含有类型为Map<Long,String>的students属性,Long对应学生的学号,String对应学生的姓名。Team类如下:
package bean;import java.util.Map;public class Team {private long id;//Team的idprivate String name;//Team的名字private Map<Long,String> students//Team中包含多个学生,Long对应学号,String对应学生姓名//setXxx()及getXxx()方法省略}则对象关系映射文件为:
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN""http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"><hibernate-mapping> <!-- bean.Team对应数据库中的team表 --> <class name="bean.Team" table="team"> <!-- team表主键自增1 --> <id name="id" column="id" type="long"><generator class="increment"/></id> <!-- Team的名字 --> <property name="name" column="name" type="string"></property> <!-- 对应于Team类的Map<Long,String>类型的students属性 --> <map name="students" table="students"><key column="team_id"></key><!-- students表通过team_id与team表关联 --><index column="cardID" type="long"></index><!-- 对应于Map<key,value>中的key --><element column="student_name" type="string"></element><!-- 对应于Map<key,value>中的value --> </map></class></hibernate-mapping>对<map>的说明:Hibernate会将Team对象的Map类型的students存放在另一张表中(students表)表中的记录即<key,value>的信息,此处<map>中的<key>子元素指出students表的team_id字段为students表参照team表id字段的外键(Foreign key)。两表的结构如下:
students表中的主键为(team_id,cardID),为组合主键;因为students表中team_id相同的记录可以有多个(同一个Team对象中students属性中的多个<cardID, student_name >对), cardID 相同的记录也可有多个(不同的Team对象)。
通过hibernate API保存删除更新Team对象会同时改变team和students表的信息。
2.如果students属性的类型为Map<Long,Student>,value的类型为Student类型,,就较为复杂些了,改变如下:
修改Team类的students属性及其set、get方法:
private Map<Long,Student> students;
修改Team.hbm.xml文件:
<map name="students" table="students" cascade="all"><key column="team_id"></key><index column="cardID" type="long"></index> <one-to-many class="bean.Student"/><!--对应Map<key,value>中的value--></map>
编写持久化类Student:
package bean;public class Student {private long id;private long cardID;private String name;private int age;private Team team; //getXxx()、setXxx()方法省略}创建映射文件:Student.hbm.xml并将其加入到hibernate.cfg.xml主配置文件中<mapping resource="Student.hbm.xml"/>
<class name="bean.Student" table="students"><id name="id" column="id" type="long"><generator class="increment"></generator></id><property name="name" column="name" type="string"></property><property name="age" column="age" type="int"></property><property name="cardID" column="cardID" type="long"></property> <many-to-one name="team" class="bean.Team" column="team_id" cascade="none"></many-to-one></class>
说明:
(1).Team.hbm.xml文件中的<map ...... table="studentTT">指定的表可以不存在,因为最终的表名是由Student.hbm.xml指定的;
(2).以上Team与Student通过<map>建立了一对多的双向关系,由Student的team属性可得到其对应的Team对象。
(3).Student已定义了id属性,因此students表中的主键为id而不再是先前的(team_id,cardID)组合主键。students表中的team_id字段参照team表中的主键id,两表结构如下:
(4)即使Student类中没有定义team属性(即两者之间是单向一对多),则Hibernate依然会在students表中加入一个标识Team对象的字段team_id(在<map>的<key>中指定),以便按照team_id查找students表中的与之对应的零至多个记录并将它们填充到team_id指定的Team对象的students属性中。
保存Team对象:
tx=session.beginTransaction(); Team team=new Team(); team.setName("team1"); team.setStudents(new HashMap<Long,Student>()); team.getStudents().put(100106L, new Student(100103L,23,"A"));//观察下面的SQL语句和表中的记录验证到底谁决定该记录在students表中的cardID字段值 team.getStudents().put(100102L, new Student(100102L,24,"A2")); session.save(team); tx.commit();控制台输出SQL语句(使用Hibernate自动建表):
Hibernate: select max(id) from teamHibernate: select max(id) from studentsHibernate: insert into team (name, id) values (?, ?)Hibernate: insert into students (name, age, cardID, team_id, id) values (?, ?, ?, ?, ?)//此句插入的Student的cardID为100103LHibernate: insert into students (name, age, cardID, team_id, id) values (?, ?, ?, ?, ?)Hibernate: update students set team_id=?, cardID=? where id=?//此句将先前的Student的cardID更新为100106L,由此可知最终的cardID是由put时的key决定的Hibernate: update students set team_id=?, cardID=? where id=?
删除Team对象:
Team t=(Team)session.get(Team.class, 2L);//此处2L不能写为2,否则出错,因为Team类的id是long类型的 session.delete(t);如果Team.hbm.xml中的<map>的属性cascade的值为"save-update",则设置该级联级别时,不能级联删除对应的students表中的记录,此时这些记录的某些字段值会被修改为NULL,
cardID为Map的key,team_id为students表参照Team表id字段的外键,可将cascade设为"all"或其他值,进行级联删除。
转载请注明出处:http://blog.csdn.net/jialinqiang/article/details/8683117
- Hibernate集合映射---Map
- Hibernate Map集合映射
- Hibernate Map映射文件
- Hibernate映射Map
- hibernate映射map
- hibernate映射map
- hibernate Map映射
- Hibernate映射Map
- Hibernate入门13 - Map 映射
- Hibernate入门13 - Map 映射
- Hibernate之Map-element映射
- hibernate学习笔记(map映射)
- Hibernate 基于map集合映射
- Hibernate映射 --- 集合映射(Set List Map )
- hibernate的list映射和map映射
- hibernate的list映射和map映射
- Hibernate Map映射的composite-index案例
- Hibernate Map映射的composite-element案例
- Uva-11520-Fill the Square
- 指针与引用的区别与联系
- A* 算法讲解
- java的一些基础的知识
- 2013.03.17
- Hibernate映射Map
- 问题依旧如图。。。
- Java中英文网站
- Vsftpd
- java应用小提示
- Struts2自定义拦截器实例—登陆权限验证
- 电容接法
- JQuery 的学习
- mjpg-streamer结构和mjpg_streamer.c与mjpg_streamer.h文件分析