08-hibernate注解-多对多单向外键关联

时间:2022-11-07 19:36:38

多对多单向外键

1,学生和教师构成多对多的关联关系

2,其中一个多方持有另一个多方的集合对象学生持有教室的集合

3,通过注解@JoinTable,创建中间表(作为多对多的载体,用来确定学生和教师的多对多关系)

@JoinTable(
name="teachars_students", //中间表的名字
joinColumns= {@JoinColumn(name="sid")}, //外键的字段
inverseJoinColumns= {@JoinColumn(name="tid")}) //反转控制字段的名字

最后会自动创建一个中间表teachars_students,并且这个表包含两个字段,sid和tid,并且这两个字段也是这个中间表的外键。

学生类:

1,这里学生持有教师的集合,所以学生类里面需要一个教师集合属性

2,指定多对多注解:@ManyToMany

3,指定中间表注解:并分别指定学生类的主键 sid,教师类的主键 tid。@JoinTable

package mtm_fk;
import java.util.Date;
import java.util.Set;
import javax.persistence.CascadeType;
import javax.persistence.Entity;/*JPA主键*/
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.ManyToOne;
import javax.persistence.Table; /*学生实体类*/
@Entity
@Table(name="Students",schema="sys")
public class Students { private int sid;
private String name;
private String gender;//性别
private Date birthday;
private String major;//专业 private Set<Teachers> teachers;//学生持有教师的集合 public Students()
{ } public Students( String name,String gender, Date birthday, String major) {
//super();
this.name=name;
this.gender = gender;
this.birthday = birthday;
this.major = major;
} @Id
@GeneratedValue //主键自动增长
public int getSid() {
return sid;
}
public void setSid(int sid) {
this.sid = sid;
}
public String getGender() {
return gender;
} public void setGender(String gender) {
this.gender = gender;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public Date getBirthday() {
return birthday;
} public void setBirthday(Date birthday) {
this.birthday = birthday;
} public String getMajor() {
return major;
} public void setMajor(String major) {
this.major = major;
}
@ManyToMany
@JoinTable(
name
="teachars_students", //中间表的名字
joinColumns= {@JoinColumn(name="sid")}, //外键的字段
inverseJoinColumns= {@JoinColumn(name="tid")}) //反转控制字段的名字

public Set<Teachers> getTeachers() {
return teachers;
} public void setTeachers(Set<Teachers> teachers) {
this.teachers = teachers;
}
}

教师类:

package mtm_fk;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import org.hibernate.annotations.GenericGenerator; //教室实体类
@Entity
public class Teachers { @Id
@GeneratedValue(generator
="tid")
@GenericGenerator(name="tid",strategy="assigned")
@Column(length=4)
private String tid;//教师的编号
private String tname;//姓名 public Teachers()
{ } public Teachers(String tid, String tname) {
//super();
this.tid = tid;
this.tname = tname;
} public String getTid() {
return tid;
} public void setTid(String tid) {
this.tid = tid;
} public String getTname() {
return tname;
} public void setTname(String tname) {
this.tname = tname;
}
}

测试类:

package mtm;
import java.util.Date;
import java.util.EnumSet;
import java.util.HashSet;
import java.util.Set; import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.boot.Metadata;
import org.hibernate.boot.MetadataSources;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;
import org.hibernate.tool.hbm2ddl.SchemaExport;
import org.hibernate.tool.schema.TargetType;
import org.junit.Test; import mtm_fk.Students;
import mtm_fk.Teachers; public class testStudents { @Test
public void testSchemaExport()
{
//创建服务注册对象
ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().configure().build();
//创建Metadata对象
Metadata metadata =new MetadataSources(serviceRegistry).buildMetadata();
//创建SchemaExport对象
SchemaExport export = new SchemaExport();
export.create(EnumSet.of(TargetType.DATABASE),metadata);
} @Test
public void addStudetns()
{
Configuration config=new Configuration().configure();
//创建服务注册对象。
ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().configure().build();
//创建会话工厂对象
SessionFactory sessionFactory=config.buildSessionFactory(serviceRegistry);
//创建会话对象
Session session=sessionFactory.openSession();
//开启事务
Transaction transaction=session.beginTransaction(); //创建教师对象
Teachers t1=new Teachers("T001","詹老师");
Teachers t2=new Teachers("T002","刘老师");
Teachers t3=new Teachers("T003","张老师");
Teachers t4=new Teachers("T004","陈老师"); //创建学生对象
Students s1=new Students("张三","男",new Date(),"计算机");
Students s2=new Students("李四","男",new Date(),"计算机");
Students s3=new Students("王五","男",new Date(),"计算机");
Students s4=new Students("赵六","男",new Date(),"计算机"); Set<Teachers> set1=new HashSet<Teachers>();
set1.add(t1);
set1.add(t2);
Set<Teachers> set2=new HashSet<Teachers>();
set2.add(t3);
set2.add(t4); Set<Teachers> set3=new HashSet<Teachers>();
set3.add(t1);
set2.add(t3);
set3.add(t4); Set<Teachers> set4=new HashSet<Teachers>();
set3.add(t1);
set4.add(t2);
set4.add(t4); s1.setTeachers(set1);
s2.setTeachers(set2);
s3.setTeachers(set3);
s4.setTeachers(set4);
session.save(t1);
session.save(t2);
session.save(t3);
session.save(t4); session.save(s1);
session.save(s2);
session.save(s3);
session.save(s4); transaction.commit();
}
}

测试结果:

1,学生:

08-hibernate注解-多对多单向外键关联

2,教师:

08-hibernate注解-多对多单向外键关联

3,中间表:

08-hibernate注解-多对多单向外键关联