2

Dictionary のフィールド 'code' で結合されたエンティティ Note があります。すべてのメモを取得したいのですが、n+1 の問題があります。メモを取得しているときに、休止状態でテーブル Dicionary からもデータを取得し、1 つのメモごとに 1 つの追加クエリを実行します (辞書がまだ第 1 レベルのキャッシュにない場合)。

ID で辞書を取得している場合にのみ機能する第 2 レベルのキャッシュ (ehcache を使用しています) を有効にしました。クエリ キャッシュを使用したくありません。たぶん、二次キャッシュから一次キャッシュに辞書をロードする必要がありますか?

@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