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