一对多关系是最普遍的映射关系。比如部门和职工
一对多:从部门的角度,一个部门对应多个职工
多对一:从职工的角度,多个职工对应一个部门
数据库表中结构:
表 department:did departname
表 Employee:eid ename esex did
工具类:SessionFactoryUtils .java,用来创建session工厂,后面的测试类的代码中会调用这个工具类的方法
public class SessionFactoryUtils {
private SessionFactory factory;
private static SessionFactoryUtils factoryUtils;
// 单例模式:把构造方法设置为私有的,说明不可以new这个类的实例。
private SessionFactoryUtils() {
}
// 通过定义这个类的静态方法,并且返回类型与这个类的类型一样,来实现对这个类的访问
public static SessionFactoryUtils getInstance() {
if (factoryUtils == null) {
factoryUtils = new SessionFactoryUtils();
}
return factoryUtils;
}
public SessionFactory openSessionFactory() {
if (factory == null) {
//加载主配置文件
Configuration configuration = new Configuration().configure();
//建立工厂
factory = configuration.buildSessionFactory();
}
return factory;
}
}
单向多对一:
首先两个实体类,一个部门类,一个职工类:
public class Department {
private Integer did;
private String departname;
//get和set方法,这里就不贴出来了,自己引入即可
}
public class Employee {
private Integer eid;
private String ename;
private String esex;
private Department department;
}
Employee类的映射文件:Employee.hbm.xml:多的一方,需要维护双方关系,所以里面配置有一的一方的引用。
<hibernate-mapping>
<class name="org.danni.model.entity.Employee">
<!-- 设置主键 -->
<id name="eid" column="eid">
<!-- 设置为native之后,主键会按照本来的顺序进行增长(比如之前23但是删除了,现在就从24开始) -->
<generator class="native"></generator>
</id>
<!-- 设置属性 -->
<property name="ename" column="ename"></property>
<property name="esex" column="esex"></property>
<many-to-one name="department" cascade="all" column="did"
class="org.danni.model.entity.Department"></many-to-one>
</class>
</hibernate-mapping>
many-to-one的常用属性:
name:映射类属性的名称(必须)
class:关联类的完全限定名
column:关联的字段
not-null:设置关联的字段的值是否可以为空。默认值false
lazy:指定关联对象是否使用延迟加载以及延迟加载的策略。lazy属性有三个取值:false、proxy、no-proxy。默认值proxy
fetch:设置抓取数据的策略。默认值是select
many-to-one没有inverse属