Hibernate4Step2_2

hardwork

本着应用的目的快速学习Hibernate4框架

  • Hibernate映射

前面的话

本节主要介绍:

  1. 一对一关系映射主键和外键方式
  2. 多对多关系映射单向和双向方式

一对一关系映射主键方式

通过一个Demo来理解,用户和用户地址具有一对一关系,类图如下:

user_address.mgc

User.java


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
package cn.codeforgod.model;

public class User
{

private int id;
private String name;
private Address address;

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;
}
public Address getAddress()
{

return address;
}
public void setAddress(Address address)
{

this.address = address;
}
}

Address.java


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
39
40
41
42
package cn.codeforgod.model;

public class Address
{

private int id;
private String address;
private String zipcode; // 邮政编码
private User user;

public int getId()
{

return id;
}
public void setId(int id)
{

this.id = id;
}
public String getAddress()
{

return address;
}
public void setAddress(String address)
{

this.address = address;
}
public String getZipcode()
{

return zipcode;
}
public void setZipcode(String zipcode)
{

this.zipcode = zipcode;
}
public User getUser()
{

return user;
}
public void setUser(User user)
{

this.user = user;
}
}

User.hbm.xml


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">

<hibernate-mapping package="cn.codeforgod.model">

<class name="User" table="t_user">
<id name="id" column="userId">
<generator class="native"></generator>
</id>

<property name="name" column="userName" type="string"></property>

<one-to-one name="address" class="cn.codeforgod.model.Address"
cascade="all"></one-to-one>
</class>

</hibernate-mapping>

Address.hbm.xml


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
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">

<hibernate-mapping package="cn.codeforgod.model">

<class name="Address" table="t_address">
<!-- 既是t_address主键也是t_user的外键 -->
<id name="id" column="addressId">
<generator class="foreign">
<param name="property">user</param>
</generator>
</id>

<property name="address" column="address" type="string"></property>

<property name="zipcode" column="zipcode" type="string"></property>

<!-- constrained约束,共享t_user主键 -->
<one-to-one name="user" class="cn.codeforgod.model.User"
constrained="true"></one-to-one>
</class>

</hibernate-mapping>

数据库中表的关系如下图:


user_address

一对一关系映射外键方式

类图如下:

user2_address2.mgc

User2.java


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
package cn.codeforgod.model;

public class User2
{

private int id;
private String name;
private Address2 address;

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;
}
public Address2 getAddress()
{

return address;
}
public void setAddress(Address2 address)
{

this.address = address;
}
}

Address2.java


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
39
40
41
42
package cn.codeforgod.model;

public class Address2
{

private int id;
private String address;
private String zipcode; // 邮政编码
private User2 user;

public int getId()
{

return id;
}
public void setId(int id)
{

this.id = id;
}
public String getAddress()
{

return address;
}
public void setAddress(String address)
{

this.address = address;
}
public String getZipcode()
{

return zipcode;
}
public void setZipcode(String zipcode)
{

this.zipcode = zipcode;
}
public User2 getUser()
{

return user;
}
public void setUser(User2 user)
{

this.user = user;
}
}

User2.hbm.xml


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">

<hibernate-mapping package="cn.codeforgod.model">

<class name="User2" table="t_user2">
<id name="id" column="userId">
<generator class="native"></generator>
</id>

<property name="name" column="userName" type="string"></property>

<!-- 通过unique属性设置t_user2外键唯一,
那么一条记录只能有唯一一条address与之对应,
否则多条记录可以有相同address与之对应就是多对一了
-->
<many-to-one name="address" column="address"
class="cn.codeforgod.model.Address2" cascade="all" unique="true"></many-to-one>
</class>

</hibernate-mapping>

Address2.hbm.xml


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">

<hibernate-mapping package="cn.codeforgod.model">

<class name="Address2" table="t_address2">
<id name="id" column="addressId">
<generator class="native"></generator>
</id>

<property name="address" column="address" type="string"></property>

<property name="zipcode" column="zipcode" type="string"></property>

<one-to-one name="user" class="cn.codeforgod.model.User2" property-ref="address"></one-to-one>
</class>

</hibernate-mapping>

数据库中表的关系如下图:


user2_address2

多对多关系单向映射

类图如下:

student_course.mgc

Student.java


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
package cn.codeforgod.model;

import java.util.HashSet;
import java.util.Set;

public class Student
{

private int id;
private String name;
private Set<Course> courses = new HashSet<Course>();

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;
}
public Set<Course> getCourses()
{

return courses;
}
public void setCourses(Set<Course> courses)
{

this.courses = courses;
}
}

Course.java


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
package cn.codeforgod.model;

public class Course
{

private int id;
private String name;

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;
}
}

Student.hbm.xml


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">

<hibernate-mapping package="cn.codeforgod.model">

<class name="Student" table="t_student">
<id name="id" column="studentId">
<generator class="native"></generator>
</id>

<property name="name" column="studentName"></property>

<!-- 需要通过中间表t_student_course实现多对多 -->
<set name="courses" table="t_student_course" cascade="save-update">
<key column="studentId"></key>
<many-to-many class="cn.codeforgod.model.Course" column="courseId"></many-to-many>
</set>
</class>

</hibernate-mapping>

Course.hbm.xml


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">

<hibernate-mapping package="cn.codeforgod.model">

<class name="Course" table="t_course">
<id name="id" column="courseId">
<generator class="native"></generator>
</id>

<property name="name" column="courseName"></property>
</class>

</hibernate-mapping>

数据库中表的关系如下图:


manyToMany1

多对多关系双向映射

类图如下:

student2_course2.mgc

Student2.java


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
package cn.codeforgod.model;

import java.util.HashSet;
import java.util.Set;

public class Student2
{

private int id;
private String name;
private Set<Course2> courses = new HashSet<Course2>();

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;
}
public Set<Course2> getCourses()
{

return courses;
}
public void setCourses(Set<Course2> courses)
{

this.courses = courses;
}
}

Course2.java


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
package cn.codeforgod.model;

import java.util.HashSet;
import java.util.Set;

public class Course2
{

private int id;
private String name;
private Set<Student2> students = new HashSet<Student2>();

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;
}
public Set<Student2> getStudents()
{

return students;
}
public void setStudents(Set<Student2> students)
{

this.students = students;
}
}

Student2.hbm.xml


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">

<hibernate-mapping package="cn.codeforgod.model">

<class name="Student2" table="t_student2">
<id name="id" column="studentId">
<generator class="native"></generator>
</id>

<property name="name" column="studentName"></property>

<set name="courses" table="t_student_course2" cascade="save-update">
<key column="studentId"></key>
<many-to-many class="cn.codeforgod.model.Course2" column="courseId"></many-to-many>
</set>
</class>

</hibernate-mapping>

Course2.hbm.xml


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">

<hibernate-mapping package="cn.codeforgod.model">

<class name="Course2" table="t_course2">
<id name="id" column="courseId">
<generator class="native"></generator>
</id>

<property name="name" column="courseName"></property>

<set name="students" table="t_student_course2" inverse="true">
<key column="courseId"></key>
<many-to-many class="cn.codeforgod.model.Student2" column="studentId"></many-to-many>
</set>
</class>

</hibernate-mapping>

数据库中表的关系如下图:


manyToMany2

坚持原创技术分享,您的支持将鼓励我继续创作