一对多关系映射

  两张表之间如果存在外键,就会出现一对多关系(外键不能同时是主键)
  如果想使用pojo类来表示一对多关系,这里以省份和城市为例:
  省份类中应该包含多个城市的对象,一般默认使用Set集合表示某个省份下多个城市
  城市类中应该包含一个省份的对象。
  如果在表中存在外键,且使用MyEclipse一起选择两张表生成映射,则会自动生成出一对多关系。
  先建立省份和城市表。
  CREATE TABLE province (
  id number(8) primary key ,
  title varchar2(50) not null
  );
  INSERT INTO province VALUES (1,'江苏');
  INSERT INTO province VALUES (2,'广东');
  INSERT INTO province VALUES (3,'河南');
  CREATE TABLE city (
  id number(8) primary key ,
  title varchar2(50) not null,
  province_id number(8) ,
  foreign key (province_id) references province (id) on delete cascade
  );
  INSERT INTO city VALUES (1,'南通¨',1);
  INSERT INTO city VALUES (2,'南京',1);
  INSERT INTO city VALUES (3,'苏州',1);
  INSERT INTO city VALUES (4,'广州',2);
  INSERT INTO city VALUES (5,'深圳',2);
  INSERT INTO city VALUES (6,'洛阳',3);
  INSERT INTO city VALUES (7,'南阳',3);
  COMMIT;
  生成映射:
  public class Province implements java.io.Serializable {
  private Integer id;
  private String title;
  private Set cities = new HashSet(0);
  public class City implements java.io.Serializable {
  private Integer id;
  private Province province;
  private String title;
  通过映射文件描述了这种一对多关系。
  <?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>
  <class name="org.liky.primary.pojo.Province" table="PROVINCE" schema="SUNXUN">
  <id name="id" type="java.lang.Integer">
  <column name="ID" precision="8" scale="0" />
  <generator class="increment" />
  </id>
  <property name="title" type="java.lang.String">
  <column name="TITLE" length="50" not-null="true" />
  </property>
  <!--
  在Province中存在一个名称为cities的Set集合
  -->
  <set name="cities" inverse="true">
  <!--
  关联外键是PROVINCE_ID
  -->
  <key>
  <column name="PROVINCE_ID" precision="8" scale="0" />
  </key>
  <!--
  表示当前类(Province)与City类存在一对多关系
  -->
  <one-to-many class="org.liky.primary.pojo.City" />
  </set>
  </class>
  </hibernate-mapping>
  <?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>
  <class name="org.liky.primary.pojo.City" table="CITY" schema="SUNXUN">
  <id name="id" type="java.lang.Integer">
  <column name="ID" precision="8" scale="0" />
  <generator class="increment" />
  </id>
  <!--
  当前类(city)与Province存在多对一关系,关联的对象是province,表中关联的字段是province_id
  -->
  <many-to-one name="province" class="org.liky.primary.pojo.Province" fetch="select">
  <column name="PROVINCE_ID" precision="8" scale="0" />
  </many-to-one>
  <property name="title" type="java.lang.String">
  <column name="TITLE" length="50" not-null="true" />
  </property>
  </class>
  </hibernate-mapping>
  Inverse="true"表示:关联关系反转,也就是关联关系由对方进行维护。
  关联关系在这里指的是外键字段province_id,该字段是city表的,也就是说修改city表,才可以修改这个字段,也就可以说city表维护着关联关系。对于Province来说,对方就是city,也就是说关联关系由对方(city)来维护雅思答案 www.jamo123.com
  public static void main(String[] args) {
  City c = (City) HibernateSessionFactory.getSession()。get(City.class, 5);
  System.out.println(c.getTitle());
  System.out.println(c.getProvince()。getTitle());
  }
  通过这段测试,可以看出fetch的作用
  使用get或load方法按主键查询时,如果fetch="select",是懒汉式加载,先查询出城市信息,当用到省份信息时,再查询省份。
  Fetch="join",则是一次关联查询将省份和城市一起取得托福答案 www.yztrans.com
  使用了一对多关系后,Hibernate可以自动根据关联关系,将关联数据取得。
  例如:
  查询省份,可以自动将所有城市也列表显示出来。
  String hql = "FROM Province";
  List<Province> allP = HibernateSessionFactory.getSession()。createQuery(
  hql)。list();
  Iterator<Province> iter = allP.iterator();
  while (iter.hasNext()) {
  Province p = iter.next();
  System.out.println(p.getTitle());
  Iterator<City> iter2 = p.getCities()。iterator();
  while(iter2.hasNext()) {
  City c = iter2.next();
  System.out.println(" |- " + c.getTitle());
  }
  }

转载于:https://www.cnblogs.com/haosola/p/3687582.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Mybatis是一个优秀的持久层框架,它支持多种关系映射方式,包括一对一、一对多、多对一、多对多等。下面举一个一对多关系映射的例子: 假设我们有两个表:学生表(student)和课程表(course),一个学生可以选修多门课程,因此在课程表中需要保存学生的id。我们可以通过Mybatis进行一对多关系映射。 首先我们需要定义两个Java类:Student和Course,然后在Student类中定义一个List<Course>类型的属性,用于保存学生所选修的课程。在Course类中定义一个Student类型的属性,用于保存选修该课程的学生信息。 接下来,在Mybatis的Mapper.xml文件中编写SQL语句,可以使用Mybatis的association和collection标签来实现一对多关系映射。具体操作如下: 1. 首先查询学生表,将学生信息和对应的课程id一并查询出来。 2. 然后根据查询出来的课程id查询课程表,将查询出来的课程信息赋值给Course对象。 3. 将Course对象添加到List<Course>属性中。 4. 最后返回Student对象,即可完成一对多关系映射。 以下是Mapper.xml文件的示例代码: ``` <!-- 查询学生信息和对应的课程id --> <select id="getStudent" parameterType="int" resultType="Student"> SELECT * FROM student WHERE id = #{id} </select> <!-- 根据课程id查询课程信息 --> <select id="getCourseByStudentId" parameterType="int" resultType="Course"> SELECT * FROM course WHERE student_id = #{studentId} </select> <!-- 定义一对多关系映射 --> <resultMap id="studentMap" type="Student"> <id column="id" property="id"/> <result column="name" property="name"/> <result column="age" property="age"/> <collection property="courses" ofType="Course"> <id column="id" property="id"/> <result column="name" property="name"/> <result column="teacher" property="teacher"/> </collection> </resultMap> ``` 使用以上配置,在调用Mapper接口时,即可获取到包含学生信息和所选修的课程信息的Student对象。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值