多对多的双向关联映射在项目实战中还是相当重要的,所以这里着重写一下!以学生表(Student)和老师表(Teacher)为例。
首先我们还是先看Annotations配置!
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
|
@Entity
@Table
(name=
"t_student"
)
public
class
Student {
private
Integer id;
private
String name;
private
Integer age;
private
Set<Teacher> teachers=
new
HashSet<Teacher>();
//指定从学生也可以映射老师
@ManyToMany
(mappedBy=
"students"
)
public
Set<Teacher>getTeachers() {
returnteachers;
}
publicvoidsetTeachers(Set<Teacher> teachers) {
this
.teachers = teachers;
}
@Id
@GeneratedValue
public
Integer getId() {
returnid;
}
publicvoid setId(Integerid) {
this
.id = id;
}
@Column
(name=
"s_name"
)
public
String getName() {
returnname;
}
publicvoid setName(Stringname) {
this
.name = name;
}
@Column
(name=
"s_age"
)
public
Integer getAge() {
returnage;
}
publicvoid setAge(Integerage) {
this
.age = age;
}
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
|
@Entity
@Table
(name=
"t_teacher"
)
public
class
Teacher {
private
Integer id;
private
String name;
private
Set<Student> students=
new
HashSet<Student>();
//set不允许重复,最适合数据库模型
@Id
@GeneratedValue
public
Integer getId() {
returnid;
}
publicvoid setId(Integerid) {
this
.id = id;
}
@Column
(name=
"t_name"
)
public
String getName() {
returnname;
}
publicvoid setName(Stringname) {
this
.name = name;
}
@ManyToMany
@JoinTable
(name=
"t_s_two"
,
//自定义表名
joinColumns={
@JoinColumn
(name=
"teacher_id"
)},
//自定义列名
inverseJoinColumns={
@JoinColumn
(name=
"student_id"
)})
//反转,和Teacher对应的那个表的ID,也是自定义
public
Set<Student>getStudents() {
returnstudents;
}
publicvoidsetStudents(Set<Student> students) {
this
.students = students;
}
}
|
JunitTest单元测试
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
|
@Test
publicvoid add(){
try
{
Configuration cfg=
new
Configuration();
cfg.configure();
SessionFactory sessionFactory=cfg.buildSessionFactory();
Sessionsession=sessionFactory.openSession();
session.beginTransaction();
Student s=
new
Student();
s.setAge(
12
);
s.setName(
"张三"
);
session.save(s);
Student s2=
new
Student();
s2.setAge(
13
);
s2.setName(
"李四"
);
session.save(s2);
Teacher t=
new
Teacher();
t.setName(
"张老师"
);
Teacher t2=
new
Teacher();
t2.setName(
"李老师"
);
Set<Student>students=newHashSet<Student>();
students.add(s);
students.add(s2);
t.setStudents(students);
// Set<Teacher>teachers=new HashSet<Teacher>();
// teachers.add(t);
// teachers.add(t2);
// s.setTeacher(teachers);
// s2.setTeacher(teachers);
session.save(t);
session.save(t2);
session.getTransaction().commit();
sessionFactory.close();
}
catch
(HibernateException e){
e.printStackTrace();
}
}
|
XML配置方法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
<?
xml
version
=
"1.0"
?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<
hibernate-mapping
package
=
"csg.hibernate.entity"
>
<
class
name
=
"Student"
table
=
"t_student"
>
<
id
name
=
"id"
>
<
column
name
=
"id"
/>
<
generator
class
=
"native"
/>
</
id
>
<
property
name
=
"name"
/>
<
property
name
=
"age"
/>
<
set
name
=
"teachers"
table
=
"t_s_two"
>
<
key
column
=
"student_id"
/>
<
many-to-many
class
=
"csg.hibernate.entity.Teacher"
column
=
"Teacher_id"
/>
</
set
>
</
class
>
</
hibernate-mapping
>
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
<?
xml
version
=
"1.0"
?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<
hibernate-mapping
package
=
"csg.hibernate.entity"
>
<
class
name
=
"Teacher"
table
=
"t_teacher"
>
<
id
name
=
"id"
>
<
column
name
=
"id"
/>
<
generator
class
=
"native"
/>
</
id
>
<
property
name
=
"name"
/>
<
set
name
=
"students"
table
=
"t_s_two"
>
<
key
column
=
"teacher_id"
/>
<
many-to-many
class
=
"csg.hibernate.entity.Student"
column
=
"student_id"
/>
</
set
>
</
class
>
</
hibernate-mapping
>
|
Ok,大家看到的其实就是将XML中的Set里面的值进行拷贝,修改, 需要注意的是
table和cloum都需要一致!这样建立的中间表才正规!
本文转自 小夜的传说 51CTO博客,原文链接:http://blog.51cto.com/1936625305/1568931,如需转载请自行联系原作者