用户登录
用户注册

分享至

hibernate

  • 作者: hello--你的钱掉了
  • 来源: 51数据库
  • 2020-09-22

多对多

1 单向关联:

a)

关系模型(Teache多对多Student),从Teacher这一端能关联到students.

Teacher(id,name,students)多

Student(id,name)多

Set<Student> students=new HashSet<Student>()

在Teacher那一端配置

b) 例如:老师和学生的关系,老师需要知道自己教了哪些学生

c) 数据库:生成中间表

d) Annotation:@Many2Many

Teacher类中写:

private Set<Student> students = new HashSet<Student>();

@ManyToMany //多对多关联 Teacher是主的一方 Student是附属的一方 

@JoinTable(name="t_s", //指定中间表表名

joinColumns={@JoinColumn(name="teacherid")},//本类主键在中间表生成的

对应字段名

inverseJoinColumns={@JoinColumn(name="studentid")}//对方类主键在中间表

生成的对应字段名

)

public Set<Student> getStudents(){……}

e) XML:<many2many

<class name="com.xxx.Teacher">

<id name="id">

<generator class="native"/>

</id>

<property name="name"/>

<set name="students" table="t_s">table定义中间表的表名

<key column="teacher_id"></key>

<many-to-many class="com.xxx.Student" column="student_id"/>

</set>

</class>


2 双向关联:

a)

多对多双向配置只需要在两端类进行配置就才可以.

关系模型(Teache多对多Student)

Teacher(id,name,students)多

Student(id,name,teachers)多

Set<Student> students = new HashSet<Student>()

Set<Teacher> teachers = new HashSet<Teacher>();


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

c) 数据库:生成中间表

d) Annotation:

在Teacher这一端的students上配置

@ManyToMany

@JoinTable(name="t_s",

joinColumns={@JoinColumn(name="teacher_id")},

inverseJoinColumns={@JoinColumn(name="student_id")}//设置对方表的外键id

)

在Student一端的teachers只需要配置

@ManyToMany(mappedBy="students")

注意:mappedBy 与 @JoinTable等一类的配置要分开,不然表字段可能乱

e) XML:

XML配置方式:两端配置一样,注意表名和生成的中间表的字段属性名要一致

Teacher那一端配置

<set name="students" table="t_s">

<key column="teacher_id"/>

<many-to-many class="com.xxx.Student" column="student_id"/>

</set>

在Student那一端配置

<set name="teachers" table="t_s">

<key column="student_id"></key>

<many-to-many class="com.xxx.Teacher" column="teacher_id"/>

</set>

生成的数据库表和上面是一样的

随机应变


软件
前端设计
程序设计
Java相关