能否使用HIbernate访存类型LAZY但有时使用EAGER

时间:2019-06-07 16:29:55

标签: java sql hibernate

我有一个歌曲课程,其中包含与 CoverArt 课程

的惰性关联
@OneToMany(fetch=FetchType.LAZY, cascade={CascadeType.ALL})
@JoinColumn(name = "recNo")
private List<CoverArt> coverArts;

很好,我通常不需要CoverArt对象,但是有时候我需要

  1. 为了提高SQL效率
  2. 因为我想在EventThread上使用Song类,并且用户可能会尝试在HibernateSession之外访问CoverArt,所以它将失败

那我该如何修改

之类的方法
public static List<Song> getSongsWithCoverArtFromDatabase(Session session, List<Integer> ids)
{
      Criteria c = session
              .createCriteria(Song.class)
              .setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY)
              .add(Restrictions.in("recNo", ids));
      List<Song> songs = c.list();
      return songs;
}

以便它检索每首歌曲的CoverArt

1 个答案:

答案 0 :(得分:1)

您可以使用setFetchMode中的Criteria如下所述在运行时设置获取模式,

Criteria c = session
              .createCriteria(Song.class)
              .setFetchMode("coverArts", FetchMode.EAGER)
              .setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY)
              .add(Restrictions.in("recNo", ids));

有关更多信息,请https://docs.jboss.org/hibernate/orm/3.5/api/org/hibernate/FetchMode.htmlhttps://kodejava.org/how-do-i-set-the-fetch-mode-for-criteria-association/