Hibernate @OneToMany (mappedBy = "...") отношение не кэшируется - PullRequest
2 голосов
/ 02 августа 2011

У меня есть следующий класс с именем Article (упрощенно):

@Entity
@DiscriminatorValue("Article")
@Cacheable
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
class Article {
    // .....
    @OneToMany(mappedBy = "author.article")
    @Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
    Set<ArticleAuthorInformation> authors;
}

Поле авторов создает отношение к классу User.Причина, по которой вместо пользователя есть ArticleAuthorInformation, заключается в том, что мне нужна дополнительная информация для этого отношения (лицензионный платеж за статью).

Вот как это выглядит:

@Entity
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
@Cacheable
public class ArticleAuthorInformation implements Serializable {
    @Id
    ArticleAuthor author;

    @Basic(fetch = FetchType.LAZY)
    int royalty;
}

ArticleAuthor представляет собой комбинированный первичный ключ следующим образом:

@Embeddable
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
@Cacheable
public class ArticleAuthor implements Serializable {
    @ManyToOne
    @Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
    private User user;

    @ManyToOne
    @Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
    private Article article;
    // .....
}

Я добавил тонны аннотаций @Cache повсюду, но всякий раз, когда я получаю доступ к authors Set в Article, Hibernate всегда делает следующий запрос:

Hibernate: select articleaut0_.article_id as article2_2_0_, articleaut0_.user_login as user3_2_0_, articleaut0_.royalty as royalty2_0_ from ArticleAuthorInformation articleaut0_ where articleaut0_.article_id=? and articleaut0_.user_login=?

Если вы посмотрите на запрос, он вообще не имеет никакого смысла!В основном он запрашивает только поле royalty (так как оно, очевидно, знает значение других полей), к которому я не обращаюсь нигде в коде.Я даже пометил поле royalty как ленивое, но Hibernate все еще продолжает запрашивать его.

Удаление поля royalty приводит к тому, что запрос исчезает, но это не решение, мне нужно полесуществовать ...

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