一对多关联分单向一对多关系 和双向一对多关系 ;
实例: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 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 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 查询courses TUser 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查询user TCourses 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)
附上代码;