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,中間表:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM