014 一对多关联映射 单向(one-to-many)

在对象模型中,一对多的关联关系,使用集合来表示。

实例场景:班级对学生;Classes(班级)和Student(学生)之间是一对多的关系。

多对一、一对多的区别:

多对一关联映射:在多的一端加入一个外键指向一的一端,它维护的关系是多指向一的。

一对多关联映射:在多的一端加入一个外键指向一的一端,它维护的关系是一指向多的。

两者使用的策略是一样的,只是各自所站的角度不同。

Classes实体类:

public class Classes {

private int id;

private String name;

//一对多通常使用Set来映射,Set是不可重复内容。

//注意使用Set这个接口,不要使用HashSet,因为hibernate有延迟加载,

private Set students;

public int getId() {

return id;

}

public void setId(int id) {

this.id = id;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public String getStudents() {

return students;

}

public void setStudents(String students) {

this.students= students;

}

Students实体类:

public class Student {

private int id;

private String name;

public int getId() {

return id;

}

public void setId(int id) {

this.id = id;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

}

Student映射文件:

<hibernate-mapping>

<class name="com.wjt276.hibernate.Student" table="t_student">

<id name="id" column="id">

<generator class="native"/>

</id>

<property name="name" column="name"/>

</class>

</hibernate-mapping>

Classes映射文件:

<hibernate-mapping>

<class name="com.wjt276.hibernate.Classes" table="t_classess">

<id name="id" column="id">

<generator class="native"/>

</id>

<property name="name" column="name"/>

<!--<set>标签 映射一对多(映射set集合),name="属性集合名称",然后在用<key>标签,在多的一端加入一个外键(column属性指定列名称)指向一的一端,再采用<one-to-many>标签说明一对多,还指定<set>标签中name="students"这个集合中的类型要使用完整的类路径(例如:class="com.wjt276.hibernate.Student") -->

<set name="students">

<key column="classesid"/>

<one-to-many class="com.wjt276.hibernate.Student"/>

</set>

</class>

</hibernate-mapping>

导出至数据库(hbmàddl)生成的SQL语句:

create table t_classes (id integer not null auto_increment, name varchar(255), primary key (id))

create table t_student (id integer not null auto_increment, name varchar(255), classesid integer, primary key (id))

alter table t_student add index FK4B90757070CFE27A (classesid), add constraint FK4B90757070CFE27A foreign key (classesid) references t_classes (id)

数据库表结构如下:

一对多 单向存储实例:

session = HibernateUtils.getSession();

tx = session.beginTransaction();

Student student1 = new Student();

student1.setName("10");

session.save(student1);//必需先存储,否则在保存classess时出错.

Student student2 = new Student();

student2.setName("祖儿");

session.save(student2);//必需先存储,否则在保存classess时出错.

Set<Student> students = new HashSet<Student>();

students.add(student1);

students.add(student2);

Classes classes = new Classes();

classes.setName("wjt276");

classes.setStudents(students);

session.save(classes);

//提交事务

tx.commit();

生成的SQL语句:

Hibernate: insert into t_student (name) values (?)

Hibernate: insert into t_student (name) values (?)

Hibernate: insert into t_classes (name) values (?)

Hibernate: update t_student set classesid=? where id=?

Hibernate: update t_student set classesid=? where id=?

一对多,在一的一端维护关系的缺点:

因为是在一的一端维护关系,这样会发出多余的更新语句,这样在批量数据时,效率不高。

还有一个,当在多的一端的那个外键设置为非空时,则在添加多的一端数据时会发生错误,数据存储不成功。

一对多 单向数据加载:

session = HibernateUtils.getSession();

tx = session.beginTransaction();

Classes classes = (Classes)session.load(Classes.class, 2);

System.out.println("classes.name=" + classes.getName());

Set<Student> students = classes.getStudents();

for (Iterator<Student> iter = students.iterator();iter.hasNext();){

Student student = iter.next();

System.out.println(student.getName());

}

//提交事务

tx.commit();

加载生成SQL语句:

Hibernate: select classes0_.id as id0_0_, classes0_.name as name0_0_ from t_classes classes0_ where classes0_.id=?

Hibernate: select students0_.classesid as classesid1_, students0_.id as id1_, students0_.id as id1_0_, students0_.name as name1_0_ from t_student students0_ where students0_.classesid=?

时间: 2024-10-07 16:41:19

014 一对多关联映射 单向(one-to-many)的相关文章

hihernate一对多关联映射

一对多关联映射利用了多对一关联映射原理 多对一关联映射:在多的一端加入一个外键指向一的一端,它维护的关系是多指向一 一对多关联映射:在多的一端加入一个外键指向一的一端,它维护的关系是一指向多 举个例子员工和老板.你说是老板记员工比较容易还是员工记老板比较容易呢?很明显记少的比较容易啊,能维护二者的关系也能减少工作量.hibernate当然也是这么做的. 也就是说一对多和多对一的映射策略是一样的,只是站的角度不同 在关系型数据库理论中,"多对一"关联同于"一对多"关联

【SSH系列】Hibernate映射 -- 一对多关联映射

    映射原理       一对多关联映射和多对一关联映射的映射原理是一样一样的,所以说嘛,知识都是相通的,一通百通,为什么说一对多关联映射和多对一关联映射是一样的呢?因为她们都是在多的一端加入一个外键,指向一的一段,关联关系都是在多的一端进行维护,只是我们在写映射的时候发生了变化.       一对多和多对一的映射原理是一样的,但是她们之间也存在着小小的区别,毕竟世界上没有两片完全相同的叶子,她们之间的区别就是维护的关系不同,我们先来看多对一,多端维护一端的关系,在加载多端的时候,可以将一端

【SSH进阶之路】Hibernate映射——一对多关联映射(七)

上上篇博文[SSH进阶之路]Hibernate映射--一对一单向关联映射(五),我们介绍了一对一的单向关联映射,单向是指只能从人(Person)这端加载身份证端(IdCard),但是反过来,不能从身份证端加载人得信息. 上篇博文[SSH进阶之路]Hibernate映射--一对一双向关联映射(六),双向关联映射解决了单向关联映射只能从一端加载信息的缺陷,当然,双向关联映射并不影响存储,只影响加载.下面我们开始今天的内容: 一对多关联映射 映射原理 一对多关联映射和多对一关联映射的映射原理是一致的,

016 多对多关联映射 单向(many-to-many)

一般的设计中,多对多关联映射,需要一个中间表 Hibernate会自动生成中间表 Hibernate使用many-to-many标签来表示多对多的关联 多对多的关联映射,在实体类中,跟一对多一样,也是用集合来表示的. 实例场景: 用户与他的角色(一个用户拥有多个角色,一个角色还可以属于多个用户) Role实体类: public class Role { private int id; private String name; public int getId() { return id; } p

hibernate之关于使用连接表实现一对多关联映射

[Hibernate]之关于使用连接表实现一对多关联映射 基于中间表实现的一对多的关联映射,还是比较常见的. Person(人)和Group(组) Annotations配置 @Entity @Table(name="t_group") publicclass Group {     private Integer id;     private String name;     private Set<Person> persons=newHashSet<Perso

一步步学习Hibernate框架(四):采用jpa实现一对多关联映射(二)

上篇博客已经采用jpa注解来实现了一对多关联映射,将这种关联映射以外键的形式处理,现在来看看怎么以第三张表的形式处理.采用jpa注解来映射数据库要使用的jar包见上篇博客: 一步步学习Hibernate框架(三):采用jpa实现一对多关联映射(一) 现在看第二种方式:以第三张表的关系来体现 Group.java package com.tgb.zhudan; import java.util.List; import javax.persistence.CascadeType; import j

Hibernate一对多关联映射的配置及其级联删除问题

首先举一个简单的一对多双向关联的配置: 一的一端:QuestionType类 package com.exam.entity; import java.util.Set; public class QuestionType { private String typeName; private char typeUniqueness; private Set quesion; public String getTypeName() { return typeName; } public void

4.一对多关联映射

1.实体一对多关联 一对多联系(1:n)定义:如果对于实体集A中的每一个实体,实体集B中有n个实体(n≥0)与之联系,反之,对于实体集B中的每一个实体,实体集A中至多只有一个实体与之联系,则称实体集A与实体集B有一对多联系,记为1:n.实例:一个班级中有若干名学生,每个学生只在一个班级中学习. 2.数据库一对多关联 在关系模型中,只存在外键参照关系,而且是 many 方参照 one 方. 3.Hibernate单向一对多关联 在关系模型中,只存在外键参照关系,而且是 many 方参照 one 方

一步步学习Hibernate框架(三):采用jpa实现一对多关联映射(一)

JPA(Java Persistence API)是Sun官方提出的一种Java持久化规范.为Java开发人员提供了一种对象/关系映射工具,管理Java应用中的关系数据.JPA的总体思想和现有Hibernate.TopLink等ORM框架大体一致.总的来说,JPA包括以下3方面的技术: 第一:ORM映射元数据 JPA支持XML和JDK 注释(也可译作注解)两种元数据的形式,元数据描述对象和表之间的映射关系,框架据此将实体对象持久化到数据库表中. 第二:Java持久化API 用来操作实体对象,执行