zoukankan      html  css  js  c++  java
  • 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,中间表:

  • 相关阅读:
    Unity3D 事件
    Unity3D 动画回调方法
    Unity3D优化总结
    Unity3D 第一人称控制器 C#脚本
    TCP/IP与IETF的RFC
    linux内核调优参考
    nginx_tcp_proxy代理酸酸乳
    Gitlab+Jenkins实现自动部署
    inotifywait命令详解及安装
    yum无法安装nginx,报错内容为1:nginx-1.14.2-1.el7_4.ngx.x86_64: [Errno 5] [Errno 2] 没有那个文件或目录
  • 原文地址:https://www.cnblogs.com/alsf/p/7829437.html
Copyright © 2011-2022 走看看