使用Criteria API在JPA元模型中使用volatile

时间:2019-02-27 14:38:29

标签: java hibernate jpa criteria-api

我最近在这里浏览了有关休眠最佳实践的文章 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变量的值将永远不会被缓存,并且所有读写操作都将在主内存中进行。< / p>

请任何人澄清一下,使用volatile关键字到底能达到什么目的?您不认为上述代码会导致性能问题。

1 个答案:

答案 0 :(得分:0)

我认为这里的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