Hibernate Annotation 多对多 双向 示例

学生和老师的关系

学生同时有多个老师,老师同时也有多个学生

 

Student.java  学生实体类

package com.model;	//包名

import java.util.HashSet;
import java.util.Set;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.ManyToMany;

@Entity
public class Student {
	private int id;
	private String name;
	private Set<Teacher> teachers = new HashSet<Teacher>();	//持有对方的存放(关系)对象。类型必须是“Set”接口类型
	@Transient	//数据库中没有的字段,需要在这个字段中加上@Transient注释
	@ManyToMany(mappedBy="students")	// 映射对应类的关系持有对象(Set对象名),双向关系必须设置 “mappedBy”
	public Set<Teacher> getTeachers() {
		return teachers;
	}
	public void setTeahcers(Set<Teacher> teachers) {
		this.teachers = teachers;
	}
	@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 com.model;	//包名
import java.util.HashSet;
import java.util.Set;

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

@Entity
public class Teacher {
	private int id;
	private String name;
	private Set<Student> students = new HashSet<Student>();	//持有对方的存放(关系)对象。类型必须是“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	//两个实体类都为@ManyToMany
	@JoinTable(		//设置中间表
			name="t_s",		//中间表的表名
			joinColumns={@JoinColumn(name="teacher_id")},	/*修改中间表中参照着本实体的外键的字段名  */
			inverseJoinColumns={@JoinColumn(name="student_id")} 	/*修改参照本实体对应的实体的外键的字段名  */
			)
	public Set<Student> getStudents() {
		return students;
	}
	public void setStudents(Set<Student> students) {
		this.students = students;
	}
}


=============================================================================

JUnit 测试类

import org.hibernate.SessionFactory;
import org.hibernate.cfg.AnnotationConfiguration;
import org.hibernate.tool.hbm2ddl.SchemaExport;
import org.junit.Test;
public class T_STest {

	@Test
	public void testSchemaExport() {
		new SchemaExport(new AnnotationConfiguration().configure()).create(false,true);
	}
		
}

==========================================================================

生成SQL语句

create table Student (
        id integer not null auto_increment,
        name varchar(255),
        primary key (id)
    )
 
    create table Teacher (
        id integer not null auto_increment,
        name varchar(255),
        primary key (id)
    )
 
    create table t_s (
        teacher_id integer not null,
        student_id integer not null,
        primary key (teacher_id, student_id)
    )
 
    alter table t_s 
        add index FK1BF6843F43EE8 (teacher_id), 
        add constraint FK1BF6843F43EE8 
        foreign key (teacher_id) 
        references Teacher (id)
 
    alter table t_s 
        add index FK1BF683358F448 (student_id), 
        add constraint FK1BF683358F448 
        foreign key (student_id) 
        references Student (id)


 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值