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 关联关系的更多相关文章

  1. Spring Hibernate JPA 联表查询 复杂查询(转)

    今天刷网,才发现: 1)如果想用hibernate注解,是不是一定会用到jpa的? 是.如果hibernate认为jpa的注解够用,就直接用.否则会弄一个自己的出来作为补充. 2)jpa和hibern ...

  2. Spring Hibernate JPA 联表查询 复杂查询

    今天刷网,才发现: 1)如果想用hibernate注解,是不是一定会用到jpa的? 是.如果hibernate认为jpa的注解够用,就直接用.否则会弄一个自己的出来作为补充. 2)jpa和hibern ...

  3. spring data jpa hibernate jpa 三者之间的关系

    JPA规范与ORM框架之间的关系是怎样的呢? JPA规范本质上就是一种ORM规范,注意不是ORM框架——因为JPA并未提供ORM实现,它只是制订了一些规范,提供了一些编程的API接口,但具体实现则由服 ...

  4. hibernate有关联关系删除子表时可能会报错,可以用个clear避免错误

    //清除子表数据 public SalesSet removeSalesSetDistributor(SalesSet salesSet ){ List<SalesSetDistributor& ...

  5. spring+hibernate+jpa+Druid的配置文件,spring整合Druid

    spring+hibernate+jpa+Druid的配置文件 spring+hibernate+jpa+Druid的完整配置 spring+hibernate+jpa+Druid的数据源配置 spr ...

  6. hibernate jpa 2.0 报错Hibernate cannot unwrap interface java.sql.Connection

    今天在做报表的时候,利用Hibernate JPA 2.0需要获取数据库连接com.sql.Connection的时候获取不到,网上说用这种方式解决: entityManager.getTransac ...

  7. websphere部署 hibernate jpa & Error 500: javax/persistence/OneToOne.orphanRemoval()Z

    WebSphere 7 & Javax/Persistence/OneToMany.OrphanRemoval() Error 文章出处:http://www.mkyong.com/websp ...

  8. Hibernate之关联关系映射(一对一主键映射和一对一外键映射)

    1:Hibernate的关联关系映射的一对一外键映射: 1.1:第一首先引包,省略 1.2:第二创建实体类: 这里使用用户信息和身份证信息的关系,用户的主键编号既可以做身份证信息的主键又可以做身份证信 ...

  9. Spring MVC+Hibernate JPA搭建的博客系统项目中所遇到的坑

    标签: springmvc hibernate 2016年12月21日 21:48:035133人阅读 评论(0) 收藏 举报  分类: Spring/Spring MVC(6)  Hibernate ...

随机推荐

  1. 堆的操作(make_heap,push_heap,pop_heap,sort_heap,is_heap)

    堆不是一中sort ranges,堆中的元素不会以递增方式排列,内部以树状形式排列,该结构以每个结点小于等于父节点构成,优先队列就是以堆来实现 make_heap //版本一:用operator &l ...

  2. PADS 脚本记录:关于 getObjects

    PADS 脚本记录:关于 getObjects GetObjects(plogObjectTypeComponent, "ZBOM*", False) 返回的一个对象,所有 ZBO ...

  3. zabbix--3.0--1

    实验环境 实验用2到2台机器,实验所用机器系统环境如下,可以看到2台机器的主机名和IP地址 [root@linux-node1 ~]# cat /etc/redhat-release CentOS L ...

  4. Flex Cairngorm框架知识整理

    简介: Cairngorm是一个开源的Flex项目,为FLex提供了一个类似MVC的体系结构框架,它是Flex RIA开发的最好框架之一.使用Cairngorm框架可以大大提高开发和维护的效率. Ca ...

  5. 使用yum更新时不升级Linux内核的方法

    RedHat/CentOS/Fedora使用 yum update 更新时,默认会 升级内核 .但有些服务器硬件(特别是组装的机器)在升级内核后,新的内核可能会认不出某些硬件,要重新安装驱动,很麻烦. ...

  6. python一些东西

    assert repr() >>> a ['d', 'c', 'c', 'f', 'a', 'a', 'b', 'c', 'd'] >>> sorted(a) [' ...

  7. centos服务器上部署javaweb项目(转)

    本文总体参照http://blog.csdn.net/u011019141(然后更据自己情况进行更改) 一.安装JDK 1.首先要查看服务器的系统版本,是32位还是64位 #getconf LONG_ ...

  8. Linux patch命令详解

    Linux patch命令 Linux patch命令用于修补文件. patch指令让用户利用设置修补文件的方式,修改,更新原始文件.倘若一次仅修改一个文件,可直接在指令列中下达指令依序执行.如果配合 ...

  9. HADOOP1.X中HDFS工作原理

    转载自:http://www.daniubiji.cn/archives/596 HDFS(Hadoop Distributed File System )Hadoop分布式文件系统.是根据googl ...

  10. 使用php生成数字、字母组合验证码

    项目中经常会遇到一些登陆验证,支付验证等等一系列安全验证的策略.实现方法多种多样,下面就来讲解下如何用php生成简单的文字+数字组合的验证码: 所用语言php,gd库 原理解释: a>实质上是在 ...