首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >使用自然id的Hibernate实体缓存

使用自然id的Hibernate实体缓存
EN

Stack Overflow用户
提问于 2018-09-22 19:26:04
回答 1查看 692关注 0票数 2

我有一个实体Note,它由Dictionary中的字段'code‘连接。我想获取所有的笔记,但有n+1的问题。当我在获取笔记时,hibernate也会从表字典中获取数据,每个笔记一个额外的查询(如果字典已经不在一级缓存中)。

我启用了二级缓存(我正在使用ehcache),它只在我通过ID获取字典时才起作用,也许有一种方法可以使用自然id?我不想使用查询缓存。也许我应该把字典从二级缓存加载到一级缓存?

代码语言:javascript
复制
@Entity
public class Note {

    @Id
    private Long id;

    @ManyToOne
    @JoinColumn(referencedColumnName = "code")
    private Dictionary noteType;
}


@Entity
@NaturalIdCache
@Cache(usage = CacheConcurrencyStrategy.READ_ONLY)
public class Dictionary {

    @Id
    private Long id;

    @NaturalId
    @Column(unique = true, nullable = false, updatable = false, insertable = false)
    private String code;
}


@org.springframework.stereotype.Repository
public interface NoteRepository extends Repository<Note, Long> {
    List<Note> findAll();
}


@RestController
@RequiredArgsConstructor
class NoteController {

    private final NoteRepository noteRepository;

    @GetMapping("\all")
    public List<Note> getAll() {
        return noteRepository.findAll();
    }
}

我希望这是足够清楚的。谢谢。

EN

回答 1

Stack Overflow用户

发布于 2019-06-04 05:06:28

根据13.2. Configuring second-level cache mappings的说法,你必须在Dictionary上使用@javax.persistence.Cacheable

实体不会被缓存,除非显式地标记为可缓存(使用@Cacheable注释)。

根据13.4. Entity cache的说法

Hibernate二级缓存还可以通过实体的自然id加载实体

代码语言:javascript
复制
this.em.unwrap(Session.class)
    .bySimpleNaturalId(AppConfig.class)
    .load(appConfigEnum.getValue());
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52456224

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档