hibernate实体关系映射

几种实体间的关系:

  • 一对一:有两种方式
    • 主键关联:从表的主键同时又是主表的外键。从表没有单独的外键列。
      • 主表对应类

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

 

  • 多对多:主表与从表之间必须要有一个中间表

RoleBeanid; 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());

}

}

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值