где лучшее место для подсчета свойства отложенной загрузки с использованием JPA - PullRequest
1 голос
/ 27 марта 2010

Допустим, у нас есть сущность "Вопрос" и "Ответ",

@Entity

public class Question extends IdEntity {
    @Lob
    private String content;
        @Transient
    private int answerTotal;
        @OneToMany(fetch = FetchType.LAZY)
    private List<Answer> answers = new ArrayList<Answer>();
......

Мне нужно указывать, сколько ответов на вопрос каждый раз, когда задается вопрос. Поэтому мне нужно сделать подсчет:

String count = "select count(o) from Answer o WHERE o.question=:q";

Мой вопрос: где лучшее место для подсчета? (Поскольку я выполнил большой запрос о сущности Вопрос, по дате, по тегу, по категории, по запросу и т. Д. Очевидно, что это не очень хорошее решение для добавления операции подсчета в каждый запрос.

Моя первая попытка - реализовать прослушиватель @PostLoad, поэтому каждый раз при загрузке объекта Question я считаю. Однако EntityManager не может быть внедрен в слушателя. Так что этот способ не работает.

Любой намек? (Я использую Hibernate в качестве провайдера).

1 Ответ

3 голосов
/ 28 марта 2010

Если использование расширений не исключено, вы можете использовать @LazyCollection с опцией EXTRA:

@OneToMany(fetch = FetchType.LAZY)
@LazyCollection(LazyCollectionOption.EXTRA)
private List<Answer> answers = new ArrayList<Answer>();

Это позволило бы вызвать answers.size() без загрузки коллекции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...