多对多关联:

示例:Teacher和Student,一个Teacher可以教很多student,一个Student也可以被很多teacher教

 

多对多单向关联

Teacher知道自己教了哪些学生,Student不知道教自己的有哪些老师

在Teacher中建(Set集合形式的)Student对象,并添加@ManyToMany注解

1.建Teacher实体类和Student实体类,添加Annotation注解,如下

@Entity
public class Teacher {
private int id;
private String name; private Set<Student> students = new HashSet<Student>(); @Id
@GeneratedValue
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;
} @ManyToMany
// @JoinTable(name="t_s",
// joinColumns={@JoinColumn(name="t_id")},
// inverseJoinColumns={@JoinColumn(name="s_id")}
// )
public Set<Student> getStudents() {
return students;
}
public void setStudents(Set<Student> students) {
this.students = students;
} }

 

@Entity
public class Student {
private int id;
private String name; @Id
@GeneratedValue
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;
}
}

2.在hibernate.cfg.xml中添加mapping语句

<mapping class="com.hibernate.model.Teacher"/>
<mapping class="com.hibernate.model.Student"/>

3.建Junit测试类

public class ORMappingTest {

	@Test
public void test() {
new SchemaExport(new Configuration().configure()).create(true, true);
}
}

程序至此结束,运行程序,在数据库中生成表teacher、表student以及中间表teacher_student(默认名)。

中间表teacher_student中会自动生成属性名为Teacher_id和students_id的两个外键,

可用@JoinTable注解修改中间表的名字及其属性名,如下:

@ManyToMany
@JoinTable(name="t_s",
joinColumns={@JoinColumn(name="t_id")},
inverseJoinColumns={@JoinColumn(name="s_id")}
)
public Set<Student> getStudents() {
return students;
}

这样会在数据库中生成名为t_s的中间表,表中有属性名为t_id和s_id的两个外键。

 

多对多双向关联

Teacher知道自己教了哪些学生,Student也知道教自己的有哪些老师

在Teacher中建(Set集合形式的)Student对象,在Student中建(Set集合形式的)Teacher对象,并添加@ManyToMany注解

1.建Teacher实体类和Student实体类,添加Annotation注解

Teacher类,同上

Student类,如下:

@Entity
public class Student {
private int id;
private String name; private Set<Teacher> teachers = new HashSet<Teacher>(); @Id
@GeneratedValue
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;
} @ManyToMany(mappedBy="students") //多对多关系
public Set<Teacher> getTeachers() {
return teachers;
}
public void setTeachers(Set<Teacher> teachers) {
this.teachers = teachers;
}
}

 

2.在hibernate.cfg.xml中添加mapping语句----同上

3.建Junit测试类----同上

 

程序至此结束,运行程序,在数据库中生成表teacher、表student以及中间表teacher_student(默认名)。

中间表teacher_student中会自动生成属性名为Teacher_id和students_id的两个外键,

可用@JoinTable注解修改中间表的名字及其属性名,

这样会在数据库中生成名为t_s的中间表,表中有属性名为t_id和s_id的两个外键。

Hibernate多对多关联的更多相关文章

  1. hibernate多对多关联映射

    关联是类(类的实例)之间的关系,表示有意义和值得关注的连接. 本系列将介绍Hibernate中主要的几种关联映射 Hibernate一对一主键单向关联Hibernate一对一主键双向关联Hiberna ...

  2. atitit.atitit.hb many2one relate hibernate 多对一关联配置..

    atitit.atitit.hb many2one relate hibernate 多对一关联配置.. 1. 多对一单向 @ManyToOne 1 1. 其中@JoinColumn 注解 2 2.  ...

  3. 05.Hibernate多对多关联

        前言:本文讲解使用Hibernate映射多对多关联关系,并使用多种方式映射多对多关联. 1.数据库表的多对多关系     本文根据学生信息表(tb_student)和教师信息表(tb_teac ...

  4. Hibernate多对多关联映射的HQL中的in条件查询问题

    群里有朋友求解一个问题,高分求一条HQL多对多查询语句 . 问题描述见 http://topic.csdn.net/u/20090621/16/4eac6fe0-bf3e-422e-a697-f758 ...

  5. Hibernate 多对一关联查询

     版权声明:本文为博主原创文章,如需转载请标注转载地址.  博客地址:http://www.cnblogs.com/caoyc/p/5598269.html  一.单向多对一和双向多对一的区别 如果只 ...

  6. Hibernate 多对多关联映射, 中间表加查询条件

    package com.coracle.yk.xpo.po.base; import java.util.Date; import java.util.HashSet; import java.uti ...

  7. Hibernate 多对多关联Demo

    以学生[Student ]与课程[Course ]之间的关系为例: //Course .java public class Course implements Serializable { priva ...

  8. hibernate 多对一关联

    (转自尚学堂教学内容)   注解多对一: package com.bjsxt.hibernate; import javax.persistence.Entity; import javax.pers ...

  9. Hibernate 多对多关联查询条件使用

    from Brand as b inner join fetch b.styles as s where s.styleId=?

随机推荐

  1. 通过 append() 和 prepend() 方法添加若干新元素

    在上面的例子中,我们只在被选元素的开头/结尾插入文本/HTML. 不过,append() 和 prepend() 方法能够通过参数接收无限数量的新元素.可以通过 jQuery 来生成文本/HTML(就 ...

  2. spark+hadoop+sqoop+hive平台bug解决方法

    bug集锦 1. hadoop平台datanode无法启动: 原因: 由于多次hdfs namenode -format导致dfs/data/current/version中的cluserID与当前的 ...

  3. PHPStorm2017去掉参数提示 parameter name hints

    JetBrains 的各种语言的 IDE 都灰常灰常好用, 个个都是神器, PHPStorm 作为PHP开发的神器也不必多说了 今天升级到 PHPStorm 2017.1 发现增加了好些新功能, 有个 ...

  4. 【BZOJ2482】[Spoj1557] Can you answer these queries II 线段树

    [BZOJ2482][Spoj1557] Can you answer these queries II Description 给定n个元素的序列. 给出m个询问:求l[i]~r[i]的最大子段和( ...

  5. Digit Division

    Digit Division Time limit: 1 s Memory limit: 512 MiB We are given a sequence of n decimal digits. Th ...

  6. 类与类之间关系,用C#和JavaScript体现

    前言 在面向对象中,类之间的关系有六种,分别是: 关联关系(Association) 泛化关系(Generalization) 依赖(Dependency) 聚合(Aggregation) 组合(Co ...

  7. Spring 缓存注解@Cacheable 在缓存时候 ,出现了第一次进入调用 方法 ,第二次不调用的异常

    代码: @Override @Cacheable(value = CACHE_NAME, key = "'CartItemkey_'+#uId") public List<S ...

  8. coursera 《现代操作系统》 -- 第五周 同步机制(1)

    临界区块(Critical section)指的是一个访问共用资源(例如:共用设备或是共用存储器)的程序片段,而这些共用资源有无法同时被多个线程访问的特性.(不是字面意思的一个区域,是程序片段的集合) ...

  9. <block/> 并不是一个组件,它仅仅是一个包装元素,不会在页面中做任何渲染,只接受控制属性

    <block/> 并不是一个组件,它仅仅是一个包装元素,不会在页面中做任何渲染,只接受控制属性

  10. a database of all existing files

    mlocate.db(5): mlocate database - Linux man page  https://linux.die.net/man/5/mlocate.db Name mlocat ...