如何告诉Hibernate标准跳过深层次的关系?

时间:2015-11-18 08:58:09

标签: java hibernate hibernate-criteria

我有hibernate实体GeUser这个实体与Pick实体有ManyToMany关系,这个实体与ALgo实体有OneToOne关系,这个实体与DbMatch实体有ManyToMany关系。我的目标是获取GeUser实体但没有picks.algo.matches。我想在我的网络应用程序上使用GeUser对象,但对我来说不需要关于algo匹配的数据,所以我想在从数据库加载之前跳过它。

GeUser实体:

...
@Entity
public class GeUser {
   ....
   @ManyToMany
   private List<Pick> picks = new ArrayList<Pick>(0);
   ...

选择实体:

@Entity
public class Pick {
   ...
   @OneToOne
   private Algo algo;
   ...

Algo实体:

...
@Entity
public class Algo{
    ...
    // I want to skip this when GeUser entity is loading from db. Should be e.g. matches == null
    @ManyToMany
    protected List<DbMatch> matches = new ArrayList<DbMatch>(); 
    ...

GeUser dao方法:

public GeUser getUser(int user_id) {

    Criteria criteria = session.createCriteria(GeUser.class);
    criteria.add(Restrictions.eq("user_id",user_id));

    List<GeUser> users = criteria.list();

    if (users.size() > 0) {
        return users.get(0);
    } else {
        return null;
    }

}

1 个答案:

答案 0 :(得分:4)

这是一个简单的情况,可以借助Lazy加载来解决。您可以在FetchType.LAZY中指定matches Algo。只有在活动会话中访问{}时才会加载matches

...
@Entity
public class Algo{
    ...
    // I want to skip this when GeUser entity is loading from db. Should be e.g. matches == null
    @ManyToMany(fetch = FetchType.LAZY )
    protected List<DbMatch> matches = new ArrayList<DbMatch>(); 
    ...

有关延迟加载的详细信息,请按照以下教程进行操作:

希望它有所帮助,如果您需要进一步的帮助,请随时发表评论!