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

多对多单向外键

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,学生:

2,教师:

3,中间表:

原文地址:https://www.cnblogs.com/alsf/p/7829437.html