【hibernate框架】多对多单向关联(Annotation实现)

什么情况下是多对多?
举个例子:一个老师可以教多个学生,每个学生也可以被多个老师教。这就是多对多的情况。
在数据库表中这种关系该怎么设计?很简单,加一张中间表。

设计模型:
table_student id<int> <pk>
table_teacher id<int> <pk>

中间表:
T_S t_id<int> <pk,fk2> s_id<int> <pk,fk1>

比如老师2教学生1,在中间表中就存2,1
老师2教学生3,在中间表中就存2,3
这就可以表示多对多的关系了。

hibernate中利用Annotation注解实现:
Student.java:

package cn.edu.hpu.many2many;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity
@Table(name="m_student")
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;
	}

}

Teacher.java:

package cn.edu.hpu.many2many;

import java.util.HashSet;
import java.util.Set;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.ManyToMany;
import javax.persistence.Table;

import cn.edu.hpu.many2many.Student;

@Entity
@Table(name="m_teacher")
public class Teacher {
	private int id;
	private String name;
	private Set<Student> students=new HashSet<Student>();
	//选择set的原因是因为,set互相之间不会有重复的
	//跟数据库模型比较匹配

	@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
	public Set<Student> getStudents() {
		return students;
	}
	public void setStudents(Set<Student> students) {
		this.students = students;
	}

}

生成的建表语句:
 create table m_student (
        id integer not null auto_increment,
        name varchar(255),
        primary key (id)
    )

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

    create table m_teacher_m_student (
        m_teacher_id integer not null,
        students_id integer not null,
        primary key (m_teacher_id, students_id)
    )

    alter table m_teacher_m_student 
        add index FK9536C8FA2DA52D4 (m_teacher_id), 
        add constraint FK9536C8FA2DA52D4 
        foreign key (m_teacher_id) 
        references m_teacher (id)

    alter table m_teacher_m_student 
        add index FK9536C8FA34A96CA5 (students_id), 
        add constraint FK9536C8FA34A96CA5 
        foreign key (students_id) 
        references m_student (id)

除了m_student和m_teacher表以外,还生成了一张m_teacher_m_student表,
里面的m_teacher_id属性和students_id分别添加了外键关联。

我如果想改变一下它默认生成表的名字,以及中间那张表默认列的名字,
这个时候怎么做?

做法:
一个Annotation属性叫做:@JoinTable(name="t_s")
加在@ManyToMany下面:
@ManyToMany
@JoinTable(name="t_s")
public Set<Student> getStudents() {
return students;
}

改中间表的字段名称:
@ManyToMany
@JoinTable(name="t_s",
joinColumns={@JoinColumn(name="teacher_id")},//指明的是当前这个实体类的表的名字(加s防止联合主键)

inverseJoinColumns={@JoinColumn(name="student_id")}//逆转的、对方的的表名(所对应的另一张表)
)
public Set<Student> getStudents() {
return students;
}

不需要背,会查文档即可。

转载请注明出处:http://blog.csdn.net/acmman

时间: 2024-11-26 20:01:05

【hibernate框架】多对多单向关联(Annotation实现)的相关文章

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

      在hibernate中非常重要的就是映射,在前面的博文中,小编简单的介绍了基本映射,基本映射是对一个实体进行映射,关联映射就是处理多个实体之间的关系,将关联关系映射到数据库中,所谓的关联关系在对象模型中有一个或多个引用.这个比较简单,但是基础知识还是需要好好掌握的哦,还有一些关联映射,比如user && group,她们之间的关系是一对多,我们知道一个用户只能属于一个组,但是一个组可以包好N多个用户,所以他们之间的关系就是多对一的关系,接着我们来看他们的对象模型以及关系模式.

【hibernate框架】多对一单向关联(Annotation实现)

一个组有多个用户,一个用户只能属于一个组. 使用Annotation注解来实现多对一单项关联 Group.java: package cn.edu.hpu.many2one; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.Table; @Entity @Table(name="t_grou

Hibernate从入门到精通(十)多对多单向关联映射

上一篇文章Hibernate从入门到精通(九)一对多双向关联映射中我们讲解了一下关于一对多关联映射的 相关内容,这次我们继续多对多单向关联映射. 多对多单向关联映射 在讲解多对多单向关联映 射之前,首先看一下相关类图和代码,具体如下: public class Role { private int id; private String name; public int getId() { return id; } public void setId(int id) { this.id = id;

Hibernate从入门到精通(七)多对一单向关联映射

上次的博文Hibernate从入门到精通(六)一对一双向关联映射中我们介绍了一下一对一双向关联映射,本 次博文我们讲解一下多对一关联映射 多对一单向关联映射 多对一关联映射与一对一关联映射类 似,只是在多对一的指向端可以存在多个对象,在指向端加载的时候,同时加载被指向端. 多对一和 一对一的异同 对比一对一单向关联映射和多对一单向关联映射,两者的相同之处在于在指向端被加载 的时候,指向端会被一起加载进来,这一点从如下类的结构图和代码中看出.(以下只给出多对一相关图示和 代码,一对一图示和代码参考

hibernate5(9)注解映射[1]多对一单向关联

在博客网站中,我们可能需要从某一篇文章找到其所关联的作者,这就需要从文章方建立起对用户的关联,即是多对一的映射关系. 现在先看一个配置实例:我们的文章实体类 package com.zeng.model; import javax.persistence.CascadeType; import javax.persistence.Entity; import javax.persistence.FetchType; import javax.persistence.GeneratedValue;

Hibernate框架学习之四:关联映射那些事

前言 Hibernate关联关系与客观世界中具体的映射关系很类似,在进行数据库设计的时候常常需要考虑是一对多.多对一等类似的映射关系,这其中涉及数据库设计方面的知识.映射关系可以分为单向与双向两种,具体又包括一对多.多对一.一对一以及多对多四种.所以总共有八种映射关系.这里只介绍了XML配置文件的版本. 下面的配置文件的配置方式都以下面的两个持久化类作为模板: public class Person { private int id; private String name; private i

【hibernate框架】多对一单向关联(XML实现)

一个组有多个用户,一个用户只能属于一个组. 使用XML来实现多对一单项关联 Group.java: package cn.edu.hpu.many2one; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.Table; public class Group { private int id;

Hibernate学习(四)多对一单向关联映射

Hibernate对于数据库的操作,全部利用面向对象的思维来理解和实现的.一般的单独表的映射,相信大家都没有问题,但是对于一些表之间的特殊关系,Hibernate提供了一些独特的方式去简化它. 今天就来说说多对一的关联映射. 数据库中有多对一的关系,Hibernate自然也有对象的多对一的关联关系.比如用户和用户组,一个用户只属于一个组,一个组有多名用户.我们就可以说用户和用户组的关系就是多对一的关系.用对象的uml图表示一下: 在Hibernate中如何来实现呢?首先定义这两个实体类: pac

一口一口吃掉Hibernate(四)——多对一单向关联映射

      Hibernate对于数据库的操作,全部利用面向对象的思维来理解和实现的.一般的单独表的映射,相信大家都没有问题,但是对于一些表之间的特殊关系,Hibernate提供了一些独特的方式去简化它.       今天就来说说多对一的关联映射.       数据库中有多对一的关系,Hibernate自然也有对象的多对一的关联关系.比如用户和用户组,一个用户只属于一个组,一个组有多名用户.我们就可以说用户和用户组的关系就是多对一的关系.用对象的uml图表示一下:       在Hibernat