detach() 方法的介绍

detach() 方法将实体从持久化上下文中移除,变成detach(游离)状态。变成detach状态的实体和数据库的记录不再同步。

从代码角度来看, 比如找到一个实体对象:

Usr usr = entityManager.find(Usr.class, 1L);
对这个实体进行detach
entityManager.detach(usr);

分离之后, 对这个实体的属性进行更改, 也不会写入到数据库,举例来看,用户对象的name的值是“刘备”,如果将对象从持久上下文detach,则修改这个对象属性,提交事务之后, 数据库也不会更新,代码如下:

     Usr usr = entityManager.find(Usr.class, 1);entityManager.getTransaction().begin();entityManager.detach(usr);usr.setName("刘备2");entityManager.getTransaction().commit();

执行detach之后, 这个对象就不在持久上下文了,也就是使用实体管理器的contains() 方法找不到这个对象了,使用JUnit 测试如下:

 Assertions.assertFalse(entityManager.contains(usr));

完整的测试代码

 @Testpublic void detach() {EntityManagerFactory emFactory = Persistence.createEntityManagerFactory("jpaency_mysql");EntityManager entityManager = emFactory.createEntityManager();Usr usr = entityManager.find(Usr.class, 1);entityManager.getTransaction().begin();entityManager.detach(usr); //分离对象Assertions.assertFalse(entityManager.contains(usr));//对象不包含在实体管理器中usr.setName("刘备2"); //对象值更新不会同步到数据库entityManager.getTransaction().commit();entityManager.close();emFactory.close();}

使用注意

detach() 方法一般比较少直接使用。

**需要特别注意的是: ** detach() 方法之后不能再调用merge()方法了, 因为mergef方法除了可以更新之外, 完整的功能是会将detach状态转化为managed状态, 也就是将实体加入持久化上下文,之后在事务提交的时候,如果有改动,则更改到数据库。

与 detach() 相近的方法

  • remove() , 将实体从持久化上下文中移除,同时从数据库中删除对应的记录。
  • clear() ,将持久上下文的所有实体变成detach状态。

本篇演示项目地址

  • https://github.com/osxm/jpa-ency/blob/master/src/test/java/com/osxm/jpa/api/DetachTests.java

JPA 之 detach方法的使用及注意事项相关推荐

  1. Jquery empty() remove() detach() 方法的区别

    方法简介: empty() This method removes not only child (and other descendant) elements, but also any text ...

  2. jQuery 核心 - noConflict() 方法,jQuery 文档操作 - detach() 方法

    为什么80%的码农都做不了架构师?>>>    原文地址:http://www.w3school.com.cn/jquery/manipulation_detach.asp 实例 使 ...

  3. jpa常用查询方法使用总结自定义sql查询

    文章目录 一.JPA自定义查询方法 实体类 1.1 单条件查询一条数据 1.2 单条件查询多条数据 1.3 多条件查询数据 1.4 查询某一个字段 1.5 in查询 1.6 like查询 二.自定义s ...

  4. 使用Collections.emptyList()生成的List不支持add方法___Java Collections.emptyList方法的使用及注意事项

    使用Collections.emptyList()生成的List不支持add方法 今天使用Collections.emptyList(),返回一个空的List 但是发现它不支持Add功能,调用Add会 ...

  5. Java Collections.emptyList() 方法的使用及注意事项

    Java Collections.emptyList方法的使用及注意事项 一.emptyList() 作用:返回一个空的List(使用前提是不会再对返回的list进行增加和删除操作): 好处: 1. ...

  6. 如何通过打造个人IP创业赚钱?打造个人IP方法、策略和注意事项

    今天与大家分享如果通过15天时间快速打造赚钱的个人IP. 一.什么是个人IP 举几个例子,大家就很清晰明了了. 比如,很多小伙伴都知道的罗辑思维,罗辑思维现估值是13.2亿,可当年他刚开始用相机录视频 ...

  7. 注解的力量 -----Spring 2.5 JPA hibernate 使用方法的点滴整理(六): 一些常用的数据库 注解...

    一. 实体 Bean 每个持久化POJO类都是一个实体Bean, 通过在类的定义中使用 @Entity 注解来进行声明. 声明实体Bean @Entity public class Flight im ...

  8. 注解的力量 -----Spring 2.5 JPA hibernate 使用方法的点滴整理(四):使用 命名空间 简化配置...

    在(三)里面.我们引入了 <bean class="org.springframework.beans.factory.annotation.AutowiredAnnotationBe ...

  9. jpa ONetoMany使用方法

    one部分 时机项目中使用到的. @OneToMany(cascade = CascadeType.ALL,fetch = FetchType.LAZY,mappedBy="dcpDataS ...

  10. Java 判断字符串是否为空的四种方法、优缺点与注意事项

    以下是Java 判断字符串是否为空的四种方法: 方法一: 最多人使用的一个方法, 直观, 方便, 但效率很低: if(s == null ||"".equals(s)); 方法二: ...

最新文章

  1. springboot整合springSecurity使用
  2. TFS - Team Foundation Server 的安装记录
  3. 窗口捕获显示黑屏_win10每次重启黑屏假死
  4. mfc 固定编辑框输入上限和下限_MFC中编辑框数字限制范围
  5. 驯服 Tiger: 并发集合
  6. GSM:联通项目中的常见术语(BTS、BSC、MSC、VLR、HLR)
  7. 创建私有CA及其签署和吊销证书
  8. 允许局域网内其他主机访问本地MySql数据库
  9. C++结构体字节对齐
  10. 最大流模板(Edmonds-Karp)
  11. 判断字符串是只是数字
  12. Android面试题整理【转载】
  13. Jstack查看耗CPU的线程
  14. 一个借口几万条数据但是只返回十条_爬虫实践之爬取10000条菜谱数据
  15. 基于android的家庭财务通 .apk,毕业设计(论文)-基于Android的家庭财务管家的设计与实现.doc...
  16. caffe入门学习(5):绘制网络结构图
  17. js原生代码实现轮播图淡入淡出和滚动的效果
  18. 10. Linux驱动 - Ubuntu驱动签名
  19. 3. 工业大数据的创新价值
  20. 到底无支付牌照的电商公司能开展什么样的业务!!

热门文章

  1. python学习感想
  2. 2020年陕西省高等职业院校技能大赛信息安全管理与评估赛项竞赛手册
  3. VScode输入感叹号时,没有出现模板
  4. AG-DST论文笔记
  5. 三级分销系统产品设计原理
  6. Flink1.12-2021黑马 8 Flink高级特性和新特性
  7. linux bridge 抓包,Linux bridge hairpin mode
  8. Kalman Filter— Priori/Posteriori Error Covariance Matrix
  9. 23 种设计模式的分类 - Design Patterns
  10. android怎么监听多点触摸_Android笔记:触摸事件的分析与总结----多点触控