java - 在具有 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
关键字来实现什么?您不认为上面的代码会导致性能问题。
解决方案
我认为这里的 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 缓存中,在边缘情况和多线程环境中造成麻烦。
完整的解释在这里
推荐阅读
- azure-functions - Azure 功能 v3 的 Application Insights 刀片灰显
- c++ - 是否可以在 c++11 的整个 unordered_multimap 中将所有键值作为对交换?
- python - 使用 cross_val_predict 与 cross_val_score 时,scikit-learn 的分数不同
- git - github:如何记录合并冲突
- javascript - 使用数据集和数据表将数据集从 SQL 存储过程检索到 C#?
- ios - SwiftUI ScrollView 垂直和水平滚动
- c# - 是否可以让命名空间中的每个类自动共享相同的导入命名空间?
- reactjs - 反应钩子更新状态问题
- java - AWS EC2 服务器 - 源 ~/.bashrc
- laravel - 如何在 laravel 中格式化 $with 数据