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)
?附上代码;