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 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)

 附上代码;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值