почему запрос гибернации с отношением вызывает выбор отца? - PullRequest
0 голосов
/ 17 июня 2019

У меня есть класс "Отец" с отношением "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":

@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 у меня уже есть отец, поэтому у него нет 'не выбирает самого отца?

1 Ответ

1 голос
/ 17 июня 2019

@ ManyToOne выбирается EAGERly по умолчанию. Вы должны добавить FetchType.Lazy, чтобы избежать выбора.

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