2016-12-05 6 views
0

Предположим, у меня есть класс A (сопоставлен с таблицей tbl_a) и классом B (сопоставлен с таблицей tbl_b). Эти 2 класса (таблицы) имеют отношение, например, отношение OneToMany. Класс B также имеет отношение к другому классу C (таблица tbl_c). Отношение также равно OneToMany. Я делаю запрос (выберите запрос) в таблице tbl_a по критериям Hibernate. Когда я проверяю консоль, генерирует sql, который спящий, я вижу все свойства класса A, класс B и даже класс C. Даже если все работает хорошо, запрос большой и выбор всех этих свойств (столбцов) может повлиять на производительность. Я не хочу всех свойств класса B и C. Мне просто нужны свойства класса A. Есть ли конфигурация в Hibernate, чтобы не выбирать все свойства связанных таблиц? Примечание: используется значение по умолчанию Lazy fetchType.Понять sql-запрос, сгенерированный Hibernate

+1

прочитать о вещи под названием жадная загрузка :-) Обычно таблицы будут загружаться только если вы спрашиваете их. Если вы не отметили их как нетерпеливую загрузку. Обычно загружаемая загрузка лучше, но производительность разумная, но не память. – Tschallacka

ответ

0

Было бы лучше, если бы мы могли видеть, какой код вы написали. Тем не менее, попытаемся дать головы

@Entity 
 
@Table(name="a") 
 
public class A{ 
 

 
@Id 
 
@column(name="id") 
 
@GeneratedValue(Strategy=GenerationType.AUTO) 
 
private int id; 
 

 
// suppose this class is mapped to class B as many to one 
 
@ManyToOne(Fetch=FetchType.EAGER) 
 
@JoinColumn(name="b_id") 
 
private B b; 
 
//Note that it is advisable to keep many to one relationships fetch type as eager. Though it depends on project architecture. Performance wise it fetches only one instance in memory this class is mapped to. 
 

 

 
//getter setters 
 

 
} 
 

 
@Entity 
 
@Table(name="b") 
 
public class B{ 
 

 
@Id 
 
@column(name="id") 
 
@GeneratedValue(Strategy=GenerationType.AUTO) 
 
private int id; 
 

 
@OneToMany(fetch=FetchType.LAZY, mappedBy="b",Cascade=CascadeType.ALL) 
 
private Set<A> allA = new HashSet<A>(); 
 
//this says that keep a onetomany relationship but do not fetch any of the associated entities until said so. Which is advisable as because If we keep FetchType.EAGER then it will fetch more than one entity for a single entity. 
 
Suppose B entity is related to 10 A entities then it will load all of them as soon as B is fetched in memory, so it will be a performance issue for a semi large application also. 
 

 
//getter setter 
 

 
}