Hibernate多种对应关系简述

it2024-10-11  29

第一种:一对一的关系

 假设有2个表:person 和idcard

  在person和idcard表的pojo 类里面分别设置另一个表的属性:private Person person;(Idcard类里面声明person类) private Idcard idcard (Person类里面声明)

 

在配置文件中为如下表示:主表person:  <one-to-one name="idcard" class="com.guoc.vo.Idcard" cascade="all">                 </one-to-one>

 副表idcard:副表的id根据外键即主表的id<generator class="foreign">          <param name="property">person</param>             </generator>

<one-to-one name="person" class="com.guoc.vo.Person"          constrained="true">

        </one-to-one>

 

在操作的时候:Person person = new Person();   person.setPid(idcardForm.getString("pid"));

ic.setPerson(person);

 

第二种:一对多:

假设有2个表 部门dept(主表)和人员emp(从表)

在主表的pojo类里面声明:private Set emps;

在从表的pojo类里面声明:private Dept dept;

 

(主表)配置文件中的写法为:

 <set name="emps" table="emp" inverse="true" cascade="all">             <key>                 <column name="deptno" length="32" />             </key>             <one-to-many class="com.guoc.vo.Emp" />         </set>

 

(从表)配置文件中的写法为:

  <many-to-one name="dept" class="com.guoc.vo.Dept">             <column name="deptno" length="32" />         </many-to-one>

 

操作的时候为:Dept dept=new Dept();   dept.setDeptno(empForm.getDeptno());   emp.setDept(dept);

 

第三中:多对多

假设有2个表:student 和course 有多对多的关系,那必须得有另一个中间表(student_course)存储他们之间的对应关系

这样的话 就转为2个一对多的关系了

student_course的表结构为:

 

create table student_course(

   cid int not null,    sid int not null,      foreign key (sid) references student(sid),     foreign key (cid) references course(cid)

);

 

 

在student 和course的pojo 类里面都得为对应类声明,分别为:

 private Set coures;

private Set students;

 

在student的配置文件中表示为:<set name="coures" inverse="true" cascade="all" table="student_course">             <key>                 <column name="sid" not-null="true" />             </key>             <many-to-many class="com.guoc.vo.Course" column="cid"/>         </set>

在course的配置文件中表示为:<set name="students" cascade="all" inverse="true" table="student_course">             <key>                 <column name="cid" not-null="true" />             </key>             <many-to-many class="com.guoc.vo.Student" column="sid"/>         </set>

这样写好后,虽然能对student里的courses集合进行操作,但是集合里的数据一直为空,因为他们还没有关联数据,student_course表是空的,所以就得有一个操作把关联数据插入到student_course里面

所以得在pojo类里面为student_course设置一个集合属性:

private Set sids;

 private Set cids;

这样student就可以通过cids管理他和course表的对应关系

course就可以通过sids管理他和student表的对应关系

管理是建立在student_course表上的

 

student配置文件再加上此类语句:

<set name="cids" table="student_course" cascade="all">         <key>         <column name="sid"></column>         </key>         <element type="java.lang.Integer" column="cid"></element>         </set>

course配置文件加上此类语句:

 <set name="sids" cascade="all" table="student_course">         <key>          <column name="cid"></column>         </key>         <element type="java.lang.Integer" column="sid"></element>         </set>

相当student和course 表在student_course表里 是一对多的关系

 student.getCids().add(new Integer(str[i]));    DAOFactory.getStudentDAOInstance().update(student);

 取消关联的时候为:

 Course c = DAOFactory.getCourseDAOInstance().selectById(cid) ;    c.getSids().remove(new Integer(sid)) ;    DAOFactory.getCourseDAOInstance().update(c) ;

转载于:https://www.cnblogs.com/hansan198703/archive/2008/10/11/1308668.html

最新回复(0)