У меня есть следующий класс с именем 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
приводит к тому, что запрос исчезает, но это не решение, мне нужно полесуществовать ...