几种实体间的关系:
- 一对一:有两种方式
- 主键关联:从表的主键同时又是主表的外键。从表没有单独的外键列。
- 主表对应类
- 主键关联:从表的主键同时又是主表的外键。从表没有单独的外键列。
<hibernate-mapping>
<class name="com.lovo.bean.ManBean"table="man">
<id name="id">
<generator class="native"></generator>
</id>
<property name="manName"column="manName"></property>
<!--关联表 name表示属性名 class为该属性的类型
casecade表示对主表对象操作时,从表是否做级联操作-->
<one-to-one name="code"class="com.lovo.bean.CodeBean"
cascade="all"></one-to-one>
</class>
</hibernate-mapping>
- 从表对应类
<hibernate-mapping>
<class name="com.lovo.bean.CodeBean"table="t_code">
<id name="id">
<!--froeign表示该主键同时也是外键 -->
<generator class="foreign">
<!--man为属性名,表示该主键由ManBean对象的主键生成-->
<paramname="property">man</param>
</generator>
</id>
<property name="codeName"column="codeName"></property>
<!--constrained表示该表的主键存在外键约束
lazy="false"表示取消延迟加载,查询该对象时,关联对象立即查询-->
<one-to-one name="man"class="com.lovo.bean.ManBean"
constrained="true"lazy="false"></one-to-one>
</class>
</hibernate-mapping>
- 外键关联:从表中存在外键列,关联主表的主键列。单外键列是不重复
- 主表对应类
<hibernate-mapping>
<class name="com.lovo.bean.UserBean"table="t_user">
<id name="id">
<generatorclass="native"></generator>
</id>
<property name="userName"column="userName"></property>
<property name="birthday"column="birthday"></property>
<!-- inverse表示 -->
<set name="roomSet"inverse="true">
<!-- 配置从表的外键 -->
<key column="userId"></key>
<!-- 集合中存放元素的类型 -->
<one-to-manyclass="com.lovo.bean.RoomBean"/>
</set>
</class>
</hibernate-mapping>
- 从表 对应类
<hibernate-mapping>
<class name="com.lovo.bean.CodeBean"table="t_code">
<id name="id">
<generatorclass="native"></generator>
</id>
<property name="codeName"column="codeName"></property>
<!-- 唯一外键关联,是多对一的特列。 unique表示外键列是唯一的 column为外键列名 -->
<many-to-onename="man" class="com.lovo.bean.ManBean"unique="true" column="manId"></many-to-one>
</class>
</hibernate-mapping>
- 一对多:
- 主表
<hibernate-mapping>
<class name="com.lovo.bean.UserBean"table="t_user">
<id name="id">
<generatorclass="native"></generator>
</id>
<property name="userName"column="userName"></property>
<property name="birthday"column="birthday"></property>
<set name="roomSet"inverse="true">
<!-- 配置从表的外键 -->
<key column="userId"></key>
<!-- 集合中存放元素的类型 -->
<one-to-manyclass="com.lovo.bean.RoomBean"/>
</set>
</class>
</hibernate-mapping>
从表对应类
<hibernate-mapping>
<class name="com.lovo.bean.RoomBean"table="t_room">
<id name="id">
<generatorclass="native"></generator>
</id>
<property name="address"column="address"></property>
<property name="price"column="price"></property>
<many-to-one name="user"class="com.lovo.bean.UserBean"
column="userId"lazy="false"></many-to-one>
</class>
</hibernate-mapping>
- 多对多:主表与从表之间必须要有一个中间表
RoleBean:id; roleName ; gradeSet= new HashSet();
GradeBean : id; gradeName ; roleSet
t_role : id primary key auto_increment ;roleName; gradeId
t_grade: idprimary key auto_increment ; gradeName; roleId
t_role_grade: id primary key auto_increment ; roleId; gradeId
RoleBean.hbm.xml:
<hibernate-mapping>
<class name="com.lovo.bean.RoleBean"table="t_role">
<idname="id">
<generatorclass="native"></generator>
</id>
<property name="roleName"column="roleName"></property>
<set name="gradeSet"table="t_role_grade">
<!--当前对象对应中间表的外键列 -->
<key column="roleId"></key>
<many-to-many class="com.lovo.bean.GradeBean"column="gradeId"></many-to-many>
</set>
</class>
</hibernate-mapping>
GradeBean.hbm.xml
<hibernate-mapping>
<class name="com.lovo.bean.GradeBean"table="t_grade">
<idname="id">
<generatorclass="native"></generator>
</id>
<property name="gradeName"column="gradeName"></property>
<set name="roleSet"table="t_role_grade">
<key column="gradeId"></key>
<many-to-many class="com.lovo.bean.RoleBean"column="roleId"></many-to-many>
</set>
</class>
</hibernate-mapping>
以Role角色为例子:添加、删除、修改和按角色ID查找
public class RoleDaoImpl extends BaseDaoimplements IRoleDao {
@Override
public void add(RoleBeanroleBean, int[] gradeArray) {
//得到session对象
Session session = this.getSession();
//开启事务处理
session.beginTransaction();
try {
//添加与角色,首先遍历权限数组,再将之添加到用户权限数组中
for(int gradeId:gradeArray){
GradeBean gradeBean =(GradeBean)session.get(GradeBean.class, gradeId);
//添加角色的权限
roleBean.getGradeSet().add(gradeBean);
}
//添加角色
session.save(roleBean);
//提交事务
session.getTransaction().commit();
} catch (Exception e) {
e.printStackTrace();
//当try块中有异常时,执行回滚事务
session.getTransaction().rollback();
}finally {
//关闭session
session.close();
}
}
@Override
public void del(int id){
// TODO Auto-generated method stub
Session session = this.getSession();
session.beginTransaction();
try {
RoleBean roleBean = (RoleBean)session.get(RoleBean.class,id);
session.delete(roleBean);
session.getTransaction().commit();
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
session.getTransaction().rollback();
}finally {
session.close();
}
}
@Override
public void update(intid, int[] gradeArray) {
//得到session
Session session = this.getSession();
//开启事务管理
session.beginTransaction();
try {
//获得角色对象
RoleBean roleBean = (RoleBean)session.get(RoleBean.class,id);
//要修改角色权限,应先将角色以前的权限清除
roleBean.getGradeSet().clear();
//再遍历新的权限数组,将之添加到角色权限数组
for(int gradeId:gradeArray){
GradeBean gradeBean =(GradeBean)session.get(GradeBean.class, gradeId);
//添加角色权限
roleBean.getGradeSet().add(gradeBean);
}
session.getTransaction().commit();
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
session.getTransaction().rollback();
}finally {
session.close();
}
}
@Override
public RoleBean findById(int id) {
Session session = this.getSession();
session.beginTransaction();
RoleBean roleBean =(RoleBean)session.get(RoleBean.class, id);
//有集合时要先用一次,否则会抛出懒异常
roleBean.getGradeSet().iterator();
session.close();
return roleBean;
}
public static void main(String[] args) {
RoleDaoImpl daoImpl = new RoleDaoImpl();
// daoImpl.add(newRoleBean("助理"), new int[]{1,2,3});
// daoImpl.del(5);
// daoImpl.update(5,new int[]{2,3,4});
// RoleBeanroleBean = daoImpl.findById(5);
// System.out.println(roleBean+""+roleBean.getGradeSet());
}
}