我最近在这里浏览了有关休眠最佳实践的文章 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
关键字到底能达到什么目的?您不认为上述代码会导致性能问题。
答案 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缓存中,这会在边缘情况和多线程环境中造成麻烦。