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 class="native"/></id><property name="name" /><set name="courses" cascade="all"><key column="user_id"></key><one-to-many class="TCourses"/></set></class> Tcourses.hbm.xml:
<hibernate-mapping package="com.keith.one2many.uni"><class name="TCourses" table="TCourses"><id name="coursesId"><generator class="native"/></id><property name="name" /></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 intoTUser(name) values(?)Hibernate: insert intoTCourses(name) values(?)Hibernate: insert intoTCourses(name) values(?)Hibernate: insert intoTCourses(name) values(?)Hibernate: updateTCourses setuser_id=? where coursesId=?Hibernate: updateTCourses setuser_id=? where coursesId=?Hibernate: updateTCourses setuser_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 class="native"/></id><property name="name" /><many-to-one name="user" column="user_id" class="TUser"/></class></hibernate-mapping>测试代码(添加数据):
// 新增用户 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) 附上代码;
页:
[1]