Hibernate笔记3(xml方式配置映射)

一对多|多对一操作

orm操作

r 确定表之间的关系
 例如客户和联系人  customer 1     linkman *

o 对象,创建实体对象

Customer类,提供无参构造,和属性(get/set方法)

private Long cust_id;
private String cust_name;
private String cust_source;
private String cust_industry;
private String cust_level;
private String cust_phone;
private String cust_mobile;
//添加对应多表实体set集合
private Set<LinkMan> linkmen=new HashSet<>();

LinkMan类

private Long lkm_id;
private String lkm_name;
private Character lkm_gender;
private String lkm_phone;
private String lkm_mobile;
private String lkm_email;
private String lkm_memo;
//添加对应的Customer对象
private Customer customer;

m 配置映射关系
    Customer.hbm.xml
    <set name="linkmen">
            <key column="lkm_cust_id"></key>
            <one-to-many class="LinkMan"/>
    </set>
    LinkMan.hbm.xml
    <!--配置多对一-->
    <many-to-one name="customer" class="Customer" column="lkm_cust_id"></many-to-one>

castcade属性:级联操作

  • save-update:级联保存
  • delete:级联删除
  • all: 级联保存+级联删除
    不建议使用

    inverse属性:是否放弃维护关系

    • false默认值
    • true 放弃维护关系
      只有一的一方能放弃维护关系.通常情况下,一的一方都是需要放弃维护关系的.如果放弃了维护关系,我们要通过多的一方表达关系
<set name="linkmen" inverse="true" cascade="delete" lazy="extra">
                    <key column="lkm_cust_id"></key>
                    <one-to-many class="LinkMan"/>
    </set>

    <many-to-one name="customer" class="Customer" column="lkm_cust_id" cascade="delete"></many-to-one>

移除关系

       //获取联系人
        LinkMan linkMan = session.get(LinkMan.class, 1L);
        //设置客户
        linkMan.setCustomer(null);

添加关系

        //获取联系人
        LinkMan linkMan = session.get(LinkMan.class, 1L);

        //获取客户
        Customer c = session.get(Customer.class, 5L);
        //设置客户
        linkMan.setCustomer(c);

多对多操作

  • R 关系数据库 例如 用户表 user 角色表role 多对多的关系
    多对对关系用中间表表达,中间表分别引用两张表的主键
  • O 对象
    User类
    private Long user_id;
    private String user_code;
    private String user_name;
    private String user_password;
    private Character user_state;

    //多对多
    private Set<Role> roles=new HashSet<>();
Role类
    private Long role_id;
    private String role_name;
    private String role_memo;
    //多对多
    private Set<User> users=new HashSet<>();
  • M 映射配置
    – User.hbm.xml
<set name="roles" table="sys_user_role" cascade="delete">
     <key column="user_id"></key>
     <many-to-many column="role_id" class="Role"/>
</set>

– Role.hbm.xml

<set name="users" table="sys_user_role" inverse="true">
        <key column="role_id"></key>
        <many-to-many column="user_id" class="User"/>
</set>

为了避免关系维护重复,导致出现异常.一般情况下都会在多对多关系中选择一方放弃维护关系.哪一方放弃需要看业务逻辑.
用户|角色 : 录入用户时指定角色,用户维护角色放弃.
订单|商品: 录入订单时指定购买了那些商品.订单维护,商品放弃.
老师|学生:学生入学指定由哪个老师教,学生维护.老师放弃

多对多移除关系

        //获得用户
        User u = session.get(User.class, 9L);

        //获得角色
        Role r = session.get(Role.class, 10L);

        u.getRoles().remove(r);

多对多添加关系

        //获得用户
        User u = session.get(User.class, 4L);

        //获得角色
        Role r = session.get(Role.class, 9L);

        u.getRoles().add(r);

对象关系导航查询

  • 根据客户找联系人
        //获得客户
        Customer c = session.get(Customer.class, 5l);
        //获取联系人
        Set<LinkMan> linkmen = c.getLinkmen();

        System.out.println(c);

        System.out.println(linkmen);
  • 根据联系人查找客户

        LinkMan linkMan = session.get(LinkMan.class, 1l);
        //获得客户
        Customer c = linkMan.getCustomer();

        System.out.println(linkMan);

        System.out.println(c);
关联级别懒加载
  • 一对多/多对多
    一对多/多对对配置懒加载
  • 多对一懒加载
    多对一
    所有懒加载使用默认值即可.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值