• Hibernate多对多关联


    多对多关联:

    示例:Teacher和Student,一个Teacher可以教很多student,一个Student也可以被很多teacher教

    多对多单向关联

    Teacher知道自己教了哪些学生,Student不知道教自己的有哪些老师

    在Teacher中建(Set集合形式的)Student对象,并添加@ManyToMany注解

    1.建Teacher实体类和Student实体类,添加Annotation注解,如下

    @Entity
    public class Teacher {
    	private int id;
    	private String name;
    	
    	private Set<Student> students = new HashSet<Student>();
    	
    	@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="t_s",
    //	           joinColumns={@JoinColumn(name="t_id")},
    //	           inverseJoinColumns={@JoinColumn(name="s_id")}
    //	)
    	public Set<Student> getStudents() {
    		return students;
    	}
    	public void setStudents(Set<Student> students) {
    		this.students = students;
    	}
    	
    }

    @Entity
    public class Student {
    	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;
    	}
    }

    2.在hibernate.cfg.xml中添加mapping语句

    <mapping class="com.hibernate.model.Teacher"/>
    <mapping class="com.hibernate.model.Student"/>

    3.建Junit测试类

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

    程序至此结束,运行程序,在数据库中生成表teacher、表student以及中间表teacher_student(默认名)。

    中间表teacher_student中会自动生成属性名为Teacher_id和students_id的两个外键,

    可用@JoinTable注解修改中间表的名字及其属性名,如下:

    @ManyToMany
    @JoinTable(name="t_s",
               joinColumns={@JoinColumn(name="t_id")},
    	    inverseJoinColumns={@JoinColumn(name="s_id")}
    )
    public Set<Student> getStudents() {
    	return students;
    }

    这样会在数据库中生成名为t_s的中间表,表中有属性名为t_id和s_id的两个外键。

    多对多双向关联

    Teacher知道自己教了哪些学生,Student也知道教自己的有哪些老师

    在Teacher中建(Set集合形式的)Student对象,在Student中建(Set集合形式的)Teacher对象,并添加@ManyToMany注解

    1.建Teacher实体类和Student实体类,添加Annotation注解

    Teacher类,同上

    Student类,如下:

    @Entity
    public class Student {
    	private int id;
    	private String name;
    	
    	private Set<Teacher> teachers = new HashSet<Teacher>();
    
    	@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(mappedBy="students")     //多对多关系
    	public Set<Teacher> getTeachers() {
    		return teachers;
    	}
    	public void setTeachers(Set<Teacher> teachers) {
    		this.teachers = teachers;
    	}	
    }

    2.在hibernate.cfg.xml中添加mapping语句----同上

    3.建Junit测试类----同上

    程序至此结束,运行程序,在数据库中生成表teacher、表student以及中间表teacher_student(默认名)。

    中间表teacher_student中会自动生成属性名为Teacher_id和students_id的两个外键,

    可用@JoinTable注解修改中间表的名字及其属性名,

    这样会在数据库中生成名为t_s的中间表,表中有属性名为t_id和s_id的两个外键。

  • 相关阅读:
    Java 二分查找
    Java 快速排序法 冒泡排序法 选择排序法 插入排序法
    XAF-BI.Dashboard模块概述 web/win
    XAF-列表视图数据访问模式
    XAF-列表视图编辑模式
    XAF-UI元素概述
    如何为CriteriaOperator过滤对象转换为lambda表达式,即:linq to xpo的动态where语句
    XAF视频教程来啦,已出15课
    如何隐藏winform中报表设计器中的按钮
    ReportDesigner中实现保存,保存所有,注册ICommandHandler方式实现
  • 原文地址:https://www.cnblogs.com/weilunhui/p/3898054.html
Copyright © 2020-2023  润新知