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. Debug outlook add-in (office.js) 小技巧

    这几天在使用office.js 做outlook add-in的时候出现了一个问题: 不知道运行时去调试. 这里给大家介绍两个调试add-in 的方法. office365 其他软件 add-ins ...

  2. 套接字选项——getsockopt和setsockopt

    这两个函数仅用于套接字 #include <sys/socket.h> int getsockopt(int sock, int level, int optname, void *opt ...

  3. Quart.net配置oracle的坑

    引用的Oracle.DataAccess.dll是64位, 生成选项需要去除默认勾选的 “首选32位”,不然会导致未能加载程序集

  4. webpack 的 入口(Entry)、输出(Output)

    入口(Entry) 入口定义了我们的应用代码开始执行的那个文件,webpack从这个文件开始打包.你能定义一个入口点(常见于单页应用 - Single-Page Application), 或者多个入 ...

  5. js 的深拷贝

    出处:https://www.cnblogs.com/Chen-XiaoJun/p/6217373.html function deepClone(initalObj, finalObj) { var ...

  6. js实现表单提交 onsubmit

    <!--HTML--> <form role="form" class="form-edit-add edit-form" action=&q ...

  7. [转]Aroon Indicator

    Aroon Indicator Trend Oscillator Description The Aroon indicator, developed by Tushar Chande, indica ...

  8. MVC4.0,并完美结合Razor引擎

    本文主要解决“当前上下文不存在ViewBag”的问题, 在View视图实际使用过程中,如果引用不正确会提示“当前上下文不存在ViewBag”,首先需要引入“Microsoft.CSharp”类库 然后 ...

  9. ML: 降维算法-LE

    PCA的降维原则是最小化投影损失,或者是最大化保留投影后数据的方差.LDA降维需要知道降维前数据分别属于哪一类,而且还要知道数据完整的高维信息.拉普拉斯特征映射 (Laplacian Eigenmap ...

  10. Python实战(6)单线程和多线程导入mysql数据对比测试

    单线程脚本 导入文件的行数 # wc -l /data/logs/testlog/20120219/testlog1/* 1510503 total # -*- coding: utf-8 -*- # ...