• Hibernate Student_Course_Score设计


    示例

    设计代码,实现在数据库中建student表、course表、和score表,展现三者关系

    student表:id、name

    course表:id、name

    score表:id、score、student_id、course_id

    三张表的关联关系如下:

    2

    设计思路

    1.首先创建Student实体类和Course实体类

    会自动创建中间表,通过@JoinTable注解,设置中间表名为“score”,属性名分别为“student_id”和“course_id”

    @ManyToMany
    @JoinTable(name="score",
        joinColumns={@JoinColumn(name="student_id")},
        inverseJoinColumns={@JoinColumn(name="course_id")})

    2.创建实体类Score

        private int id;
        private int score;
        private Student student;
        private Course course;

    根据步骤1中创建的中间表,通过@Table注解设置表名为“score”,

    通过@ManyToOne注解设置属性名分别为“student_id”和“course_id”

    3.Junit测试类

    @Test
    public void test() {
        new SchemaExport(new Configuration().configure()).create(true, true);
    }

    具体实现代码如下

    1.Student类

    @Entity
    public class Student {
    	private int id;
    	private String name;
    	
    	private Set<Course> courses = new HashSet<Course>();
    	
    	@Id
    	@GeneratedValue
    	public int getId() {
    		return id;
    	}
    	public void setId(int id) {
    		this.id = id;
    	}
    	public String getName() {
    		return name;
    	}
    	public void setName(String name) {
    		this.name = name;
    	}
    	
    	@ManyToMany
    	@JoinTable(name="score",                                                 //中间表名
    			joinColumns={@JoinColumn(name="student_id")},            //属性名
    			inverseJoinColumns={@JoinColumn(name="course_id")})      //属性名
    	public Set<Course> getCourses() {
    		return courses;
    	}
    	public void setCourses(Set<Course> courses) {
    		this.courses = courses;
    	}	
    }

    2.Course类

    @Entity
    public class Course {
    	private int id;
    	private String name;
    	@Id
    	@GeneratedValue
    	public int getId() {
    		return id;
    	}
    	public void setId(int id) {
    		this.id = id;
    	}
    	public String getName() {
    		return name;
    	}
    	public void setName(String name) {
    		this.name = name;
    	}
    }

    3.Score类

    @Entity
    @Table(name="score")      //对应中间表名
    public class Score {
    	private int id;
    	private int score;
    	private Student student;
    	private Course course;
    	@Id
    	@GeneratedValue
    	public int getId() {
    		return id;
    	}
    	public void setId(int id) {
    		this.id = id;
    	}
    	public int getScore() {
    		return score;
    	}
    	public void setScore(int score) {
    		this.score = score;
    	}
    	
    	@ManyToOne
    	@JoinColumn(name="student_id")    //对应属性名
    	public Student getStudent() {
    		return student;
    	}
    	public void setStudent(Student student) {
    		this.student = student;
    	}
    	@ManyToOne()
    	@JoinColumn(name="course_id")    //对应属性名
    	public Course getCourse() {
    		return course;
    	}
    	public void setCourse(Course course) {
    		this.course = course;
    	}	
    }

    4.存储一条数据

    @Test
    public void testsave() {
    		
    	Session session = sf.getCurrentSession();
    	session.beginTransaction();
    		
    	Student s = new Student();
    	s.setName("lisi");
    		
    	Course c = new Course();
    	c.setName("c++");
    		
    	Score score = new Score();
    	score.setStudent(s);
    	score.setCourse(c);
    //	score.setScore(90);  //若不设置,默认为0
    		
    	session.save(s);
    	session.save(c);
    	session.save(score);
    		
    	session.getTransaction().commit();		
    }

    注意

    create table score (id integer not null, score integer not null, course_id integer, student_id integer not null auto_increment, primary key (student_id, course_id))
    
     运行程序,会发现通过程序自动建的score表是有问题的。
    
     我们想要的是,id为主键,且自增
    
     而结果是,student_id和course_id为联合主键,且student_id自增
    
     这是hibernate自身的bug,所以应该手动去数据库中,修改表的结构
  • 相关阅读:
    首次使用随便写点哦
    js中call、apply和bind的区别
    前端的事件流以及事件处理程序
    javascript中数组的深拷贝的方法
    我的第一篇博客
    圆盘转动按钮-react native
    鼠标拖拽删除
    js基础 -----鼠标事件(按下 拖拽)
    清除浮动的几种常用方法
    VUE常见问题解决
  • 原文地址:https://www.cnblogs.com/weilunhui/p/3905737.html
Copyright © 2020-2023  润新知