多对多
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>
生成的数据库表和上面是一样的
随机应变
@Entity
@Table(name="Student")
public class Student implements Serializable {
private Long id;
private Group group;
@Id
@GeneratedValue
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
@ManyToOne
public Group getGroup() {
return group;
}
public void setGroup(Group group) {
this.group = group;
}
}
@Entity
@Table(name="group")
public class Group implements Serializable {
private Long id;
private List<Student> students;
@Id
@GeneratedValue
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
@OneToMany(mappedBy="group",
fetch=FetchType.LAZY,
cascade=CascadeType.ALL)
public List<Student> getStudents() {
return students;
}
public void setStudents(List<Student> students) {
this.students = students;
}
}
查询的时候直接load组或者学生,要查看相关信息的话 直接用LOAD出来的对象.get就好了
想要使用注解方式开发,请使用3.5以上的版本,如果3.5以下的话,请下载跟hibernate版本想对应的Annotation包
这个是多对多建一个中间表
用户登录
还没有账号?立即注册
用户注册
投稿取消
文章分类: |
|
还能输入300字
上传中....