`

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)

 附上代码;

0
0
分享到:
评论

相关推荐

    hibernate多对多关联映射

    总之,Hibernate的多对多关联映射是解决复杂关系数据库设计的关键技术之一。通过合理的配置和使用,开发者可以轻松管理实体之间的多对多关系,提高开发效率。理解并熟练掌握这部分知识对于提升Java企业级应用开发...

    hibernate多对多双向关联

    "hibernate_many2many_2"这个文件名可能是指一个关于Hibernate多对多关联的示例或教程的第二部分,可能包含配置文件、Java实体类、映射文件以及相关的测试代码。 **详细知识点:** 1. **实体类定义**:在Hibernate...

    Hibernate一对一主键关联映射(单向关联)

    在Java的持久化框架Hibernate中,一对一(One-to-One)关联映射是常见的关系映射方式之一,尤其在处理两个实体之间存在唯一对应关系时非常有用。本篇将重点讲解如何实现一对一主键关联映射的单向关联,并通过一个...

    hibernate多对一关联关系

    下面将详细介绍Hibernate中的多对一关联关系以及如何实现这一关系。 1. **多对一关联的配置**: - 在实体类中,使用`@ManyToOne`注解来声明一个字段作为多对一的关联字段。这个注解通常用于父类的引用,例如: ``...

    Hibernate一对一唯一外键关联映射(双向关联)

    在Java的持久化框架Hibernate中,一对一(One-to-One)关系是对象之间的关联类型之一,它代表了两个实体之间存在唯一的对应关系。本篇将详细讲解如何使用Hibernate实现一对一唯一外键(Unique Foreign Key)关联映射...

    hibernate之一对一关联映射

    本篇将详细探讨 Hibernate 之中的一对一关联映射,这是一种常见的关系数据库设计模式,在实际开发中经常被用到。 一对一关联映射在Hibernate中表示两个实体类之间存在一对一的关系,也就是说,每个实体类的对象只...

    hibernate一对一之唯一外键关联(双向关联)

    - 虽然一对一关联提供了便利,但过多的一对一关联可能会影响性能,因为每次查询可能涉及多个表,增加数据库访问的复杂性。因此,应谨慎设计实体间的关系。 8. **实例应用** - 在实际项目中,一对一关联常用于用户...

    hibernate之一对多配置demo

    【hibernate之一对多配置demo】:在Java开发中,Hibernate是一个强大的对象关系映射(ORM)框架,它简化了数据库与Java对象之间的交互。本教程主要关注Hibernate中的一对多关系配置,并通过XML来实现,同时也涵盖了...

    Hibernate教程07_关系映射之一对一双向主键关联

    在" Hibernate教程07_关系映射之一对一双向主键关联"中,我们将学习如何设置这种关联。首先,我们需要创建两个实体类,例如`Employee`和`Department`。在每个类中,我们都需要定义主键字段,并用`@Id`注解标记。然后...

    Hibernate教程05_关系映射之一对一双向外键关联

    在Hibernate中,一对一关联的配置主要通过注解或XML配置文件完成。对于双向关联,我们需要在两个实体类中分别设置相应的属性和关联注解。 在实体类A中,我们将添加一个类型为B的属性,并使用`@OneToOne`注解来指定...

    传智播客hibernate教程_保存多对一关联关系的更进一步分析

    本教程“传智播客hibernate教程_保存多对一关联关系的更进一步分析”深入探讨了如何在Hibernate中处理多对一的关联关系。这种关联意味着一个实体(多方)可以与多个其他实体(一方)相关联,而每个其他实体只与一个...

    Hibernate一对一唯一外键关联映射(单向关联)

    在Java的持久化框架Hibernate中,一对一(One-to-One)关联映射是常见的关系数据库模型映射方式之一。本文将详细解析如何实现一对一唯一外键(Uniquely Foreign Key,UFK)关联映射,特别是在单向关联的情况下的具体...

    hibernate一对一之唯一外键关联(单向关联)

    在这个场景下,我们将讨论一种特殊的一对一关联方式——唯一外键关联(Single ForeignKey Association),且为单向关联。这种关联方式意味着在一个实体中有一个字段作为另一个实体的主键引用。 首先,我们需要理解...

    Hibernate关联映射

    一对一关联适用于实体间一对一的关系,一对多适用于一个实体可以拥有多个子实体的情况,而多对多则适用于两个实体之间存在多对多的关系。理解这些关联类型及其配置对于设计高效、灵活的 ORM 解决方案至关重要。

    hibernate一对多关联映射学习小结

    在Hibernate中,一对多关联映射和多对一关联映射的区别在于维护的关系不同。多对一关联映射中,多的一端维护一的一端的关系,在加载多的一端时,可以将一的一端加载上来。一对多关联映射中,一的一端维护多的一端的...

    hibernate关联关系之一对一双向关联

    这种关联关系可以是单向的,也可以是双向的,而这里的"hibernate关联关系之一对一双向关联"着重讨论的是后者。双向关联意味着两个实体类都可以直接访问对方,提供了更方便的数据操作。 在Hibernate中,一对一双向...

    hibernate多对多

    在Java的持久化框架Hibernate中,多对多(Many-to-Many)关系是数据库中常见的关联类型,它允许一个实体实例对应多个其他实体实例,反之亦然。在本案例中,我们将深入探讨如何使用Hibernate来处理多对多的关系映射,...

    Hibernate的多对一和一对多操作实例

    本文将深入探讨Hibernate框架下“多对一”和“一对多”的关联关系,并通过一个具体示例来阐述其操作流程与实现细节。 ### Hibernate中的“多对一”和“一对多” 在数据库设计中,“多对一”(Many-to-One)和“一...

Global site tag (gtag.js) - Google Analytics