在日常开发中,如果使用hibernate的话,常常会被hibernate的事务搞得焦头烂额。今天解决了之前项目中一直存在的问题,记录一下。

问题描述

有一张表TemplateCopy,如下

  1. public class TemplateCopy {
  2. @Id
  3. @GeneratedValue(strategy = GenerationType.IDENTITY)
  4. private Integer id;
  5. private String name;
  6. private String description;
  7. @OneToMany(mappedBy = "template")
  8. private Set<SubDomainWeightsCopy> subDomainWeights;
  9. @OneToMany(mappedBy = "template")
  10. private Set<QuestionWeightsCopy> questionWeights;
  11. }

关联了两张表:

  1. public class SubDomainWeightsCopy {
  2. @JsonIgnore
  3. @Id
  4. @ManyToOne
  5. @JoinColumn(name = "template_id")
  6. private TemplateCopy template;
  7. @Id
  8. @ManyToOne
  9. @JoinColumn(name = "sub_domain_id")
  10. private SubDomainCopy subDomain;
  11. private BigDecimal weights; //权重
  12. private BigDecimal score;
  13. @Data
  14. public static class RelationId implements Serializable {
  15. private Integer template;
  16. private Integer subDomain;
  17. }
  18. }
  1. public class QuestionWeightsCopy implements IWeightsValue {
  2. @JsonIgnore
  3. @Id
  4. @ManyToOne
  5. @JoinColumn(name = "template_id")
  6. private TemplateCopy template;
  7. @Id
  8. @ManyToOne
  9. @JoinColumn(name = "question_id")
  10. private QuestionCopy question;
  11. private BigDecimal weights;
  12. private BigDecimal score;
  13. @Data
  14. public static class RelationId implements Serializable {
  15. private Integer template;
  16. private Integer question;
  17. }
  18. }

简单的看一下,TemplateCopy中有一堆SubDomainWeightsCopy,和一堆QuestionWeightsCopy,我们在保存TemplateCopy的时候,通常按照如下来保存

  1. 1. templateCopy = save(TemplateCopy)
  2. 2. QuestionWeightsCopy.setTemplateCopy(templateCopy)
  3. 3. save(QuestionWeightsCopy)
  4. 4. SubDomainWeightsCopy.setTemplateCopy(templateCopy)
  5. 5. save(SubDomainWeightsCopy)

到这就好了,数据库已经保存了关联关系。但是,这时候如果返回save好的templateCopy,subDomainWeights和questionWeights将会是null。

问题解决

使用EntityManager的clear方法

  1. 保存完毕后,执行entityManager.clear();
  2. 然后再次查询该对象,即可完整返回该对象。

EntityManager clear的作用?

EntityManager clear方法会清空其关联的缓存,从而强制在事务中稍后执行新的数据库查询。

什么时候使用EntityManager clear

  1. 在进行批处理时,为了避免巨大的缓存占用内存并因长时间的脏检查而增加刷新的时间
  2. 在进行DML或SQL查询时,它将完全绕过实体管理器缓存。在这种情况下,由于缓存,将不会实际去数据库查,会直接将缓存返回。所以造成了数据库已经保存了,但是查出来还是未保存的状态。这时候需要清除缓存以避免这种不一致。(本案例就是这种情况的实际例子)

参考

StackOverFlow大神回答

EntityManager的Clear方法的使用的更多相关文章

  1. List集合的removeAll(Collection<E> col) 和clear方法的区别

    //removeAll()方法private static void testList(){ List<String> list = new ArrayList<String> ...

  2. java.nio.ByteBuffer中flip,rewind,clear方法的区别

    对缓冲区的读写操作首先要知道缓冲区的下限.上限和当前位置.下面这些变量的值对Buffer类中的某些操作有着至关重要的作用: limit:所有对Buffer读写操作都会以limit变量的值作为上限. p ...

  3. Hibernate中evict方法和clear方法说明

    Hibernate中evict方法和clear方法说明 先创建一个对象,然后调用session.save方法,然后调用evict方法把该对象清除出缓存,最后提交事务.结果报错: Exception i ...

  4. delphi 中TStringList Clear 方法的时候该对象有没有被释放

    delphi 中TStringList 通过function AddObject(const S: string; AObject: TObject): Integer; 方法添加了一个对象,请问我在 ...

  5. List集合的clear方法

    一 . list.clear()底层源码实现 在使用list 结合的时候习惯了 list=null :在创建这样的方式,但是发现使用list的clear 方法很不错,尤其是有大量循环的时候 1.lis ...

  6. Selenium clear()方法无法清掉数据

    问题描述 clear()方法执行过后, 数据还是在. 根本原因 存在镜像节点. 操作clear()清掉数据后, 镜像节点的数据还在, 就会再补充回去. 解决办法 添加下面代码就可以连同镜像的数据一起去 ...

  7. Python 字典 clear()方法

    描述 Python 字典 clear() 方法用于删除字典内所有元素. 语法 clear() 方法语法: D.clear() 参数 无. 返回值 该方法没有任何返回值. 实例 以下实例展示了 clea ...

  8. Python3 列表 clear() 方法

    描述 Python3 列表 clear() 方法用于清空列表,类似于 del a[:]. 语法 clear() 方法语法: L.clear() 参数 无. 返回值 该方法没有返回值. 实例 以下实例展 ...

  9. Python3 字典 clear()方法

     Python3 字典 描述 Python 字典 clear() 函数用于删除字典内所有元素. 语法 clear()方法语法: dict.clear() 参数 NA. 返回值 该函数没有任何返回值. ...

随机推荐

  1. Codeforces 1249F Maximum Weight Subset (贪心)

    题意 在一颗有点权的树上,选若干个点,使得这些点两两距离大于k,且点权和最大 思路 贪心的取比较大的值即可 将所有点按照深度从大到小排序,如果当前点点权\(a[i]\)大于0,则将距离为k以内的所有点 ...

  2. HDU 6274 Master of Sequence (暴力+下整除)

    题意 两个1e5的数组a,b,定义\(S(t)=\left \lfloor \frac{t-b_i}{a_i} \right \rfloor\),有三个操作 1 x y:将\(a[x]\)变为\(y\ ...

  3. SpringBoot Jpa 自定义查询

    SpringBoot Jpa 自定义查询 持久层Domain public interface BaomingDao extends JpaRepository<BaomingBean,Inte ...

  4. django中Template语言

    Template本身也有自己的语言和语法,用来处理简单的数据显示 常用语法 判断指令 {% if 条件 %}...{%endif%} {% if 条件 %}...{%elif 条件 %}...{%en ...

  5. vSphere虚拟系统 添加虚拟服务器

    虚拟插槽数:插槽的概念与物理服务器的物理CPU类似,为虚拟机分配m个插槽,相当于为物理服务器配置了m颗物理CPU: 每个插槽的内核数:相当于物理服务器每颗物理CPU的核心数为n: 在上述条件下虚拟机获 ...

  6. centos7使用MySQL的Yum存储库安装mysql5.7.27

    下载yum源 官网地址:http://dev.mysql.com/downloads/repo/yum/ centos7系统: http://dev.mysql.com/get/mysql57-com ...

  7. Vue使用Clipboard.JS在h5页面中复制内容

    安装clipboard.js github路径:https://github.com/zenorocha/clipboard.js 安装: npm install clipboard --save 引 ...

  8. A——大整数加法(HDU1002)

    题目: I have a very simple problem for you. Given two integers A and B, your job is to calculate the S ...

  9. 分形的奥秘!分形着色器!shader 编程入门实战 ! Cocos Creator!

    极致的数学之美! 什么是分形? "一个粗糙或零碎的几何形状,可以分成数个部分,且每一部分都(至少近似地)是整体缩小后的形状" 简单来说,分形(fractal)就像这个doge表情包 ...

  10. ArcGIS Server、SDE许可更新

    环境:windows server2008,ArcGIS10.1系列. 一.更新arcgis server许可 选择许可文件进行导入即可.注意最好从开始程序中找到并打开软件授权窗口.直接双击运行ecp ...