Hibernate-关联关系
1、Hibernate关联关系
1.1、单向关联
实体对象:
实体对象之间的加载关系是单向的,即两个实体对象中只有一个可以访问另一个。
持久类:
A类:必须添加保存B类数据的成员。B为一,则A成员为private B b;|B为多,则A成员为private Set<B> b;。
B类:不添加。
1.2、双向关联
实体对象:
实体对象之间的加载关系是双向的,即两个实体对象都可以访问另一个。
持久类:
A类:必须添加保存B类数据的成员。B为一,则A成员为private B b;|B为多,则A成员为private Set<B> b;。
B类:必须添加保存A类数据的成员。A为一,则B成员为private A a;|A为多,则B成员为private Set<A> a;。
1.3、关联映射
(Book- Category)-->(书-类别)
1.3.1、多对一(单向)
A类:Book。B为一,则Book成员为private Category category;。
B类:Category。
<!--映射文件Book.hbm.xml-->
<many-to-one name="category" class="Category">
<column name="categoryId"/>
</many-to-one>
categoryId:数据库Book表中与category属性值相关联的字段名。用于存放Category表中的id值
- 访问:
book.getCategory().getName();
1.3.2、多对一(双向)
A类:Book。B为一,则Book成员为private Category category;。
B类:Category。A为多,则Category成员为private Set<Book> books;。
<!--映射文件Book.hbm.xml-->
<many-to-one name="category" class="Category">
<column name="categoryId"/>
</many-to-one>
<!--映射文件Category.hbm.xml-->
<set name="books">
<key column="categoryId"/>
<one-to-many class="Book"/>
</set>
categoryId:数据库Book表中与category属性值相关联的字段名。用于存放Category表中的id值
- 访问:
//查找类别对象//得到代理对象
Category c = (Category) session.load(Category.class, new Integer(1));
System.out.println("类别名称:" + c.getName());
//获取类别中的所有图书
Set<Book> books = c.getBooks();
//通过迭代输出图书名称
for (Iterator<Book> it = books.iterator(); it.hasNext();) {
Book book2 = (Book) it.next();
System.out.println("图书名称:" + book2.getName());
}
1.3.3、一对一主键(双向)
(User-IdCard)-->(用户-身份证)
User持久化类成员::private IdCard idCard;
<!--主类映射文件User.hbm.xml-->
<!-- 一对一映射 -->
<one-to-one name="idCard"/>
IdCard持久化类成员:private User user;
<!--从类映射文件IdCard.hbm.xml-->
<id name="id">
<!-- 参考User的外键 -->
<generator class="foreign">
<param name="property">user</param>
</generator>
</id>
<!-- 一对一映射 -->
<one-to-one name="user" constrained="true"/>
name="user":指定持久化类中的属性名称。
constrained:用于建立一个约束,表明IdCard对象的主键必须参照User的外键。
- 在数据库中创建相关表:
//在servlet中使用SchemaExport类的create()方法创建两个表结构并建立关联关系
Configuration cfg=new Configuration().configure();//加载Hibernate配置文件
SchemaExport export = new SchemaExport(cfg);
export.create(true, true);//第1个参数:是否覆盖原有的数据库,第2个参数:是否新建数据库。
1.3.4、一对一外键
(User-IdCard)-->(用户-身份证)
User持久化类成员::private IdCard idCard;
<!--主类映射文件User.hbm.xml-->
<!-- 一对一映射 -->
<many-to-one name="idCard" unique="true"/>
使用unique="true"会对此外键生成唯一约束。
1.3.5、多对多
- 多对多关联映射通过第3张表实现,也分为单向关联和双向关联映射。
- 在两个映射文件中都要添加第3张表的说明。
(Student-Course)-->(学生-课程)
Student持久化类成员::private Set<Course> course;
<!--映射文件Student.hbm.xml-->
<set name="course" table="tb_student_course">
<key column="studentId"></key>
<many-to-many class="Course" column="courseId"/>
</set>
Course持久化类成员::private Set<Student> students;
<!--映射文件Course.hbm.xml-->
<set name="students" table="tb_student_course">
<key column="courseId"/>
<many-to-many class="Student" column="studentId"/>
</set>
-
table="tb_student_course"
- 用于指定映射的第3张表。
-
- 指定第3张表形成的字段。
-
* many-to-many:映射多对多关联关系。 * class:指定关联的对象。 * column:指定关联的字段。
浙公网安备 33010602011771号