分享web开发知识

注册/登录|最近发布|今日推荐

主页 IT知识网页技术软件开发前端开发代码编程运营维护技术分享教程案例
当前位置:首页 > 前端开发

Hibernate ??JPA ??关联关系

发布时间:2023-09-06 01:16责任编辑:白小东关键词:Hibernate

 

Hibernate JPA 关联关系:

  使用cascade做级联操作(只有在满足数据库约束时才会生效):

    CascadeType.PERSIST:

      级联保存,只有调用persist()方法,才会级联保存相应的数据

    CascadeType.REFRESH:

      级联刷新,当多个用户同时操作一个实体,为了用户取到的数据是实时的,在使用实体中的数据之前就调用一下refresh()方法

    CascadeType.MOVE:

      级联删除,当调用remove()方法删除实体时会先删除相关联的数据

    CascadeType.MERGE:

      级联更新,调用merge()方法时会更新实体中的数据

    CascadeType.ALL:

      包含以上所有级联属性

Hibernate JPA 一对一:   

   在person端配置关联,只保存person端

 ???//关联身份证 ???@OneToOne(mappedBy="person", cascade=CascadeType.ALL) ???private Card card;
 ???//关联公民 ???@OneToOne ???@JoinColumn(name="person_id") ???private Person person;
 ???????Person p = new Person(); ???????p.setName("draco"); ???????????????Card c = new Card(); ???????c.setCardno("001"); ???????????????p.setCard(c); ???????????????session.save(p);

Hibernate JPA 一对多:

   2.1 没有关联,两端同时保存

 ???//一端:一对多 ???@OneToMany(mappedBy="customer") ???private Set<Order> orders = new HashSet<Order>();
 ???//多端:多对一 ???@ManyToOne ???@JoinColumn(name="custmer_id") ????private Customer customer;
 ???????Customer c = new Customer(); ??????????c.setName("draco"); ???????????????????Order o = new Order(); ???????o.setProductName("apple"); ???????????????c.getOrders().add(o); ???????????????session.save(o); ???????session.save(c);

  2.2 在一端配置关联,只保存一端

 ???//一对多 ???@OneToMany(mappedBy="customer", cascade={CascadeType.PERSIST}) ???private Set<Order> orders = new HashSet<Order>();
 ???????Customer c = new Customer(); ??????????c.setName("draco3"); ???????????????????Order o = new Order(); ???????o.setProductName("apple3"); ???????????????c.getOrders().add(o);   
    
     //session.save(c); ???????session.persist(c);

  

Hibernate JPA 多对多:

  3.1 没有配置关联,两端同时保存

 ???//关联用户 ???@ManyToMany(mappedBy="roles") ???private Set<User> users = new HashSet<User>();
 ???//关联角色 ???@ManyToMany ???@JoinTable( ???????name = "t_user_role1", ???????joinColumns=@JoinColumn(name="user_id"), ???????inverseJoinColumns=@JoinColumn(name="role_id") ???) ???private Set<Role> roles = new HashSet<Role>();
 ???????User u = new User(); ???????u.setName("draco"); ???????????????Role r = new Role(); ???????r.setName("VIP"); ???????????????u.getRoles().add(r); ??????????????session.save(u); ???????session.save(r);

 3.2 在user端配置关联,只保存user

 @ManyToMany(cascade={CascadeType.ALL})
 ???????User u = new User(); ???????u.setName("draco2"); ???????????????Role r = new Role(); ???????r.setName("VIP2"); ???????????????u.getRoles().add(r); ???????????????session.save(u); ???

 Hibernate JPA 小结结(mappedBy | @JoinColumn | cascade):

  mappedBy:

      1 当关联关系的双方都不配置mappedBy属性,那么双方会互相生成外键,并且执行3条SQL(2条插入SQL,1条额外的维护外键的SQL)

      2 没有配置mappedBy属性的一方生成外键

    3 mappedBy和@JoinColumn不能配置在同一方(否则以mappedBy为准)

      4 只能有一方配置mappedBy

   cascade:

    1 在哪一方配置级联,就对哪一方进行session操作

    2 在哪一方配置级联,就应把另一方作为属性

    3 在有外键的一方配置级联,另一方作为属性填充外键

Hibernate ??JPA ??关联关系

原文地址:http://www.cnblogs.com/roxy/p/7647125.html

知识推荐

我的编程学习网——分享web前端后端开发技术知识。 垃圾信息处理邮箱 tousu563@163.com 网站地图
icp备案号 闽ICP备2023006418号-8 不良信息举报平台 互联网安全管理备案 Copyright 2023 www.wodecom.cn All Rights Reserved