2011-06-27 2 views
0

Я использую JPA с Hibernate3 как реализацию. У меня есть таблица ассоциации UsrGrpJPA объединяет таблицу ассоциации с выбором N, сгенерированную Hibernate?

Usr.java 
@Id 
@Basic(optional = false) 
@Column(name = "usr_id") 
private String usrId; 
@OneToMany(mappedBy = "usr") 
private List<UsrGrp> usrGrpList; 

UsrGrp.java 
@EmbeddedId 
protected UsrGrpPK usrGrpPK; 
@Column(name = "updated_by") 
private String updatedBy; 
@Column(name = "updated_date") 
@Temporal(TemporalType.TIMESTAMP) 
private Date updatedDate; 
@JoinColumn(name = "grp_id", referencedColumnName = "grp_id", insertable = false, updatable = false) 
@ManyToOne(optional = false) 
private Grp grp; 
@JoinColumn(name = "usr_id", referencedColumnName = "usr_id", insertable = false, updatable = false) 
@ManyToOne(optional = false) 
private Usr usr; 

Grp.java 
@Id 
@Basic(optional = false) 
@Column(name = "grp_id") 
@OneToMany(mappedBy = "grp") 
private List<UsrGrp> usrGrpList; 

(USR) 1 -------- * (UsrGrp) * -------- 1 (GRP)

Выполнения после sql.

SELECT DISTINCT usr FROM Usr usr LEFT JOIN FETCH usr.usrGrpList 

Hibernate фактически выполняет то же количество запроса на выбор, что и числа Grp, которые у меня есть.

select grp0_.grp_id as grp1_6_0_ from grp grp0_ where grp0_.grp_id=? 
select grp0_.grp_id as grp1_6_0_ from grp grp0_ where grp0_.grp_id=? 
... 

Есть ли вообще избежать этого N запросов? Благодарю.

+0

Что вы * на самом деле * пытаетесь сделать ... на английском языке (без кода)? – Bohemian

+0

Я попытался получить список Usr с коллекцией usrGrp. Sql фактически реализует его, но с дополнительным запросом выбора Grp, сгенерированным Hibernate. Скажем, если у меня есть 100 Grp, Hibernate генерирует этот sql-выбор grp0_.grp_id как grp1_6_0_ из grp grp0_, где grp0_.grp_id =? 100 раз. – Claire

ответ

0

Да. Вы можете изменить режим выборки из поленитесь нетерпеливый:

Criteria crit = session.createCriteria(Usr.class) 
          .setFetchMode("usrgrp", FetchMode.JOIN) 

где usrgrp представляет собой набор в Usr.class.

+0

Спасибо, но у вас есть образец с JPA Annotation? – Claire

0

Эти запросы выполняются для загрузки grp каждого выбранного UsrGrp. Отметьте ManyToOne от UsrGrp до Grp как ленивый, и эти запросы должны исчезнуть. Или, если вы хотите загрузить группы в том же запросе, вы можете добавить левое соединение принести к запросу:

SELECT DISTINCT usr FROM Usr usr 
LEFT JOIN FETCH usr.usrGrpList userGroup 
LEFT JOIN FETCH userGroup.grp grp 

Вы можете также включить batch fetching уменьшить количество запросов.

PS: Гласные прохладно. UserGroup гораздо читабельнее, чем UsrGrp

+0

Решено. Спасибо вам всем!! – Claire

Смежные вопросы