多對多單向外鍵
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,中間表: