一对多
每个实体类配置文件中
在一的类配置文件里增加:
在hibernate 配置文件中指定映射文件
、
多对一
在多的类的配置文件中添加
<!-- 配置多对一关联关系 -->
<many-to-one name="grade" class="com.imooc.entity.Grade" column="gid" ></many-to-one>
其中
name="grade" 为多方引用
class="com.imooc.entity.Grade" 为乙方的实体类
column="gid" 为一方外键列名
cascade="all” 为 级联方式
测试
级联(cascade)属性
1、CascadeType.ALL(包括增、删、改、查,联动操作),其实查不算在内,查Fetch
2、CascadeType.MERGE(合并的join)--不重要
3、CascadeType.PERSIST(保存的时候在级联)
4、CascadeType.REFRESH(刷新说明:比如现在我查询出了数据,另外一个人在我查询数据之后,他对数据做了修改,这是才会级联上,hibernate会自动刷新我查询出来的数据)
5、CascadeType.REMOVE (只要在删除操作时才会级联)
6、我们一般都只设置CascadeType.ALL就OK了,
7、Cascade不是必须的,他的作用只是可以让我们快速的开发,我们也可以通过手动增、删、改、查
Fetch捉取策略
1、FetchType.EAGER(渴望的,希望马上得到)
a) 一对多关系,比如通过get()方法来get出一的一端,他之后会出一条SQL语句,不会自动去查询多的一端,如果设置FetchType.EAGER,会讲他的关联对象查询出来
b) 如果是load的话,他不会发出SQL语句,因为load支持延迟加载,只有真正获取数据时才会发SQL
2、FetchType.LAZY(懒加载)
a) 只有真正获取数据时才发出SQL语句
3、默认是:FetchType.LAZY(一对多)
4、默认是:FetchType.EAGER(多对一)
5、一般使用默认就可以了
多对一双向关联
同时在多的一方配置
<!-- 配置一对多关联关系 -->
<set name="students" table="student">
<key column="gid"></key>
<one-to-many class="com.imooc.entity.Student"/>
</set>
多的一方
<!-- 配置多对一关联关系 -->
<many-to-one name="grade" class="com.imooc.entity.Grade" column="gid" cascade="all"></many-to-one>
一的一方
<!-- 配置一对多关联关系 -->
<set name="students" table="student">
<key column="gid"></key>
<one-to-many class="com.imooc.entity.Student"/>
</set>
多对多
在每个类中添加对方的集合
在每个类的配置自文件配置多对多关系
<!-- 配置多对多关联关系 -->
<set name="projects" table="proemp" inverse="true">
<key column="rempid"></key>
//关联的外键
<many-to-many class="com.imooc.entity.Project" column="rproid"></many-to-many>
</set>
------------------------------------------------------------------------------
<!-- 配置多对多关联关系 -->
<set name="employees" table="proemp" cascade="all">
<key column="rproid"></key>
<many-to-many class="com.imooc.entity.Employee" column="rempid"></many-to-many>
</set>
table="proemp" 为中间表名不归属其他任何一个类
test
Project project1=new Project(1001,"椤圭洰涓�");
Project project2=new Project(1002,"椤圭洰浜�");
Employee employee1=new Employee(1,"鎱曞コ绁�");
Employee employee2=new Employee(2,"imooc");
project1.getEmployees().add(employee1);
project1.getEmployees().add(employee2);
project2.getEmployees().add(employee1);
Session session=HibernateUtil.getSession();
Transaction tx=session.beginTransaction();
session.save(project1);
session.save(project2);
tx.commit();
HibernateUtil.closeSession(session);
}