Dic*_*ood 9 hibernate jpa second-level-cache jpa-2.0
我现在正在我的实体上使用JPA2 @Cacheable注释,一切都运行良好.
我现在需要缓存ManyToOne关联.
在经典的Hibernate中,有必要注释与@Cache的关联.
@org.hibernate.annotations.Cache(usage=CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
private Set<Student> supervisionGroup;
Run Code Online (Sandbox Code Playgroud)
这很有效.但似乎我们不能在实体本身以外的任何东西上使用JPA2 @Cacheable注释.
我是否遗漏了某些内容,或者JPA委员会是否过于朦胧而无法意识到协会必须被缓存以及实体?当然它不能是昏暗的选择?
我想经过一些研究我能够回答我自己的问题。关键是 Hibernate 会使 2LC 中的对象脱水,这将影响您是否需要显式缓存关联。
如果我遗漏了任何内容或有任何细节错误,请添加更多详细信息。
这是一个简化的类结构:
@Entity
@Cacheable
public class Tutor
{
@OneToMany(mappedBy="tutor")
private Set<Student> students;
}
@Entity
@Cacheable
public class Student
{
@ManyToOne(fetch=FetchType.LAZY)
@JoinColumn(name="TUTOR_FK")
private Tutor tutor;
}
Run Code Online (Sandbox Code Playgroud)
二级缓存(2LC)以脱水形式存储实体,例如:
{1=CacheEntry(Tutor)[1, Jack Daw]}
{1=CacheEntry(Student)[1, Jane Smith, 1]}
Run Code Online (Sandbox Code Playgroud)
Student数据中最后的1是tutor的外键。
因此,如果您有对 Student id 1 的引用并遵循对导师的引用,我们会得到缓存命中,因为外键位于缓存中。不需要额外的选择。
但是,如果您采用其他方式,在 Tutor 上调用 getStudents(),则 2LC 中没有外键,因此需要选择。(一旦选择完成,hibernate 就有了 ids 并且可以开始命中 2LC)。
为了避免这种情况,您需要将旧的 org.hibernate.annotations.Cache 注释添加到 @OneToMany 关系中。
我手头上没有 EclipseLink 安装,所以我无法对此进行测试,但我知道 EclipseLink 以原始对象图的形式存储 2LC 数据,因此上述内容不相关。根据克里斯的回答,该实体及其引用被缓存,因此不需要进一步注释。
| 归档时间: |
|
| 查看次数: |
3436 次 |
| 最近记录: |