首页 > 解决方案 > 为什么休眠查询与关系触发父亲选择?

问题描述

我有一个关系为“oneToMany”的“父亲”类:

@Entity
@Table(name = "father")
Public class Father
{
   Private String id;
   Private Long a;
   Private Long b;

   @OneToMany(fetch=FetchType.Lazy, 
              mappedBy = 'father',
              cascade = CascadeType.ALL)
   Private List<Son> son;
}

具有关系“manyToOne”的“Son”类:

@Entity
@Table(name = "son")
Public class Son
{
   Private String id;
   Private Father father;

   @ManyToOne(cascade = CascadeType.ALL)
   @JoinColumn(name="id",referencedColumnName = "id", nullable = false, insertable = false, updatable = false)
   Public Father getFather(){
      return father;
   }

}

在我的测试中,我想选择“父亲”,然后选择“儿子”,

选择“父亲”我需要从几个表中使用连接,然后我做一个 hql 查询

 String sql = "select father.id, a.a, b.b"+
              "from father father join a a on father.id=a.id"+
              " join b b onb.id=a.id"+
              " where a.id="123";
 SQLQuery sqlQuery = session.createSQLQuery(sql).addScalar(...);
 query.setParameter("id", "123");
 query.list();
 hql = "FROM SON WHERE ID =: id";
 Query query = session.createQuery(hql);
 query.setParameter("id", "123");
 query.list(); \\ actually hibernate run select from son and after select from father

hibernate 做了“从儿子选择”,然后再次“从父亲选择” 。

我怎么能告诉hibernate我已经有了父亲,所以他不选择父亲本身?

标签: hibernatehqlmany-to-one

解决方案


@ManyToOne 默认是 EAGERly 获取的。您应该添加 FetchType.Lazy 以避免选择。

@ManyToOne(cascade = CascadeType.ALL, fetch=FetchType.Lazy)

推荐阅读