首页 > 解决方案 > 在具有 Criteria API 的 JPA 元模型中使用 volatile

问题描述

我最近在这里探索了一篇关于休眠最佳实践的文章 https://thoughts-on-java.org/hibernate-best-practices/

我遇到了一个话题

使用 Criteria API 时使用 JPA 元模型

@Generated(value = “org.hibernate.jpamodelgen.JPAMetaModelEntityProcessor”)
@StaticMetamodel(Author.class)
public abstract class Author_ {

  public static volatile SingularAttribute<Author, String> firstName;
  public static volatile SingularAttribute<Author, String> lastName;
  public static volatile SetAttribute<Author, Book> books;
  public static volatile SingularAttribute<Author, Long> id;
  public static volatile SingularAttribute<Author, Integer> version;

}

我仍然无法理解volatile那边的作用是什么,因为我们知道 volatile 变量的值永远不会被缓存,所有的写入和读取都将在主内存中完成。

请谁能澄清我,我们到底想通过使用volatile关键字来实现什么?您不认为上面的代码会导致性能问题。

标签: javahibernatejpacriteria-api

解决方案


我认为这里的 volatile 关键字是通过某种自动生成生成的,例如配置了 jpa facet 的 java eclipse 项目。

事实上,在我的项目中,eclipse 元模型(在我的例子中是 Dali)生成器的输出完全相同:

@Generated(value="Dali", date="2018-10-22T14:37:09.798+0200")
@StaticMetamodel(AnaSchema.class)
public class AnaSchema_ {
    public static volatile SingularAttribute<AnaSchema, Long> id;
    public static volatile SingularAttribute<AnaSchema, String> code;
    public static volatile SingularAttribute<AnaSchema, String> description;
}

有趣的是,休眠元模型生成也是如此,我认为在这种情况下,因为 JVM 不保证值的存储位置:在主内存或 cpu 缓存中,在边缘情况和多线程环境中造成麻烦。

完整的解释在这里


推荐阅读