我有一个实体Note,它由Dictionary中的字段'code‘连接。我想获取所有的笔记,但有n+1的问题。当我在获取笔记时,hibernate也会从表字典中获取数据,每个笔记一个额外的查询(如果字典已经不在一级缓存中)。
我启用了二级缓存(我正在使用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();
}
}
我希望这是足够清楚的。谢谢。
发布于 2019-06-04 05:06:28
根据13.2. Configuring second-level cache mappings的说法,你必须在Dictionary
上使用@javax.persistence.Cacheable
实体不会被缓存,除非显式地标记为可缓存(使用@Cacheable注释)。
根据13.4. Entity cache的说法
Hibernate二级缓存还可以通过实体的自然id加载实体
this.em.unwrap(Session.class)
.bySimpleNaturalId(AppConfig.class)
.load(appConfigEnum.getValue());
https://stackoverflow.com/questions/52456224
复制相似问题