2

我有一个实体注释,它由字典中的字段“代码”连接。我想取所有笔记,但有 n+1 个问题。当我获取笔记时,休眠也从表 Dicionary 获取数据,每个笔记有一个额外的查询(如果字典不在一级缓存中)。

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

@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();
    }
}

我希望这足够清楚。谢谢你。

4

1 回答 1

0

根据13.2。配置您必须使用@javax.persistence.Cacheable二级缓存映射Dictionary

除非明确标记为可缓存(使用 @Cacheable 注释),否则不会缓存实体。

根据13.4。实体缓存

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

this.em.unwrap(Session.class)
    .bySimpleNaturalId(AppConfig.class)
    .load(appConfigEnum.getValue());
于 2019-06-03T21:06:28.153 回答