读书人

Hibernate之一对多联系关系

发布时间: 2012-09-23 10:28:11 作者: rapoo

Hibernate之一对多关联

一对多关联分单向一对多关系和双向一对多关系;

单向一对多关系:

实例:User和Courses关系,一个User可以同时拥有多个Courses;而User所选的Courses只能属于它的主人;他们的关系是:主控方---User,被倥方---Courses;

TUser:

public class TUser implements java.io.Serializable {private static final long serialVersionUID = 1L;private Integer userid;private String name;private Set<TCourses> courses;        get()/set()}

?TCourses:

public class TCourses implements java.io.Serializable {private static final long serialVersionUID = 1L;private Integer coursesId;private String name;        get()/set()}

?TUser.hbm.xml:(对于一对多的关系,我们可以用java.util.Set()类型的Collection,在XML中的表现就是<set></set>),为了保持关联关系,我们需要在主控方配置级联关系;

<hibernate-mapping package="com.keith.one2many.uni"><class name="TUser" table="TUser" dynamic-update="true" dynamic-insert="true"><id name="userid"><generator /><set name="courses" cascade="all"><key column="user_id"></key><one-to-many name="code"><hibernate-mapping package="com.keith.one2many.uni"><class name="TCourses" table="TCourses"><id name="coursesId"><generator /></class></hibernate-mapping>

?测试方法:

//添加数据Session session = HibernateUtil.getSessionFactory().getCurrentSession();session.beginTransaction();TCourses courses1 = new TCourses();courses1.setName("java");TCourses courses2 = new TCourses();courses2.setName("linux");TCourses courses3 = new TCourses();courses3.setName("OS");Set<TCourses> courseses = new HashSet<TCourses>();courseses.add(courses1);courseses.add(courses2);courseses.add(courses3);TUser user = new TUser();user.setName("keith");user.setCourses(courseses);session.save(user);session.getTransaction().commit();

?看下Hibernate给我们的展现的SQL:

--创建数据库TCourses    create table TCourses (        coursesId integer not null auto_increment,        name varchar(255),        user_id integer,        primary key (coursesId)    )--创建数据库TUser    create table TUser (        userid integer not null auto_increment,        name varchar(255),        primary key (userid)    )--设置关系    alter table TCourses         add index FKB23474C41422125 (user_id),         add constraint FKB23474C41422125         foreign key (user_id)         references TUser (userid)--插入数据Hibernate: insert into  TUser(name) values(?)Hibernate: insert into  TCourses(name) values(?)Hibernate: insert into  TCourses(name) values(?)Hibernate: insert into  TCourses(name) values(?)Hibernate: update  TCourses set  user_id=? where coursesId=?Hibernate: update  TCourses set  user_id=? where coursesId=?Hibernate: update  TCourses set  user_id=? where coursesId=?
?双向一对多关联

双向一对多的关系是“一对多”与“多对一”关联的组合,所以我们必须在主控方配置单向一对多关系的基础上,在被动方配置与其对应的多对一关系;

我们只需在被倥方进行修改即可;

TCourses:

public class TCourses implements java.io.Serializable {private static final long serialVersionUID = 1L;private Integer coursesId;private String name;private TUser user;        get()/set()}

?TCourses.hbm.xml:

<hibernate-mapping package="com.keith.one2many.doubleSide"><class name="TCourses" table="TCourses"><id name="coursesId"><generator /><many-to-one name="user" column="user_id" name="code">// 新增用户 TUser user = new TUser(); user.setName("keith"); session.save(user);// 为用户增加课程,主动端操作 TUser user= (TUser) session.load(TUser.class, 1); TCourses courses = new TCourses(); courses.setName("java"); user.getCourses().add(courses); session.save(user);// 为用户增加课程,被动端操作 TUser user = (TUser) session.load(TUser.class, 1); TCourses courses = new TCourses(); courses.setName("OS"); courses.setUser(user); session.save(courses);

?查询:

// 通过user 查询coursesTUser user = (TUser) session.load(TUser.class, 1);System.out.println("user's name:" + user.getName());TCourses courses = null;Iterator<TCourses> it = user.getCourses().iterator();while (it.hasNext()) {courses = it.next();System.out.println("user's courses:" + courses.getName());}//通过courses查询userTCourses courses = (TCourses) session.load(TCourses.class, 2);System.out.println(courses.getUser().getName());
?

看下建表SQL:

10:07:54,209 DEBUG SchemaExport:377 -     create table TCourses (        coursesId integer not null auto_increment,        name varchar(255),        user_id integer,        primary key (coursesId)    )10:07:54,212 DEBUG SchemaExport:377 -     create table TUser (        userid integer not null auto_increment,        name varchar(255),        primary key (userid)    )10:07:54,217 DEBUG SchemaExport:377 -     alter table TCourses         add index FKB23474C46B6EDEB3 (user_id),         add constraint FKB23474C46B6EDEB3         foreign key (user_id)         references TUser (userid)

?附上代码;

读书人网 >软件架构设计

热点推荐