【问题标题】:use of volatile in JPA metamodel with Criteria API [duplicate]在具有 Criteria API 的 JPA 元模型中使用 volatile [重复]
【发布时间】:2019-02-27 14:38:29
【问题描述】:

我最近在这里探索了一篇关于休眠最佳实践的文章 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 关键字来实现什么?你不觉得上面的代码会导致性能问题吗?

【问题讨论】:

    标签: java hibernate jpa criteria-api


    【解决方案1】:

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

    实际上,在我的项目中,eclipse 元模型 (Dali in my case) 生成器的输出完全相同:

    @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;
    }
    

    hibernate metamodel generation 也很有趣,我认为在这种情况下,因为 JVM 不保证值的存储位置:在主内存中还是在 cpu 缓存中,这会在边缘情况和多线程环境中造成麻烦。

    完整的explanation is here

    【讨论】:

      猜你喜欢
      • 2019-04-18
      • 2012-04-13
      • 1970-01-01
      • 2013-08-31
      • 2013-06-21
      • 1970-01-01
      • 2021-10-13
      • 1970-01-01
      • 2019-10-13
      相关资源
      最近更新 更多